首頁  >  文章  >  後端開發  >  保護您的 PHP 應用程式免受常見漏洞影響的基本安全實踐

保護您的 PHP 應用程式免受常見漏洞影響的基本安全實踐

Linda Hamilton
Linda Hamilton原創
2024-11-02 23:34:30929瀏覽

Essential Security Practices to Protect Your PHP Application from Common Vulnerabilities

保護您的PHP 應用程式涉及保護其免受常見漏洞的影響,例如SQL 注入、跨站點腳本(XSS)、跨站點請求偽造(CSRF)、會話劫持和文件包含攻擊。這是一個帶有逐部分描述的實踐範例,可幫助您了解如何保護 PHP 應用程式。

1. 防止SQL注入

當攻擊者可以將惡意 SQL 語句注入您的查詢時,就會發生 SQL 注入。將準備好的語句與參數化查詢一起使用可以避免這種情況。

範例

<?php
// Insecure version
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$user_id'";
$result = mysqli_query($connection, $query);

// Secure version
$user_id = $_GET['id'];
$stmt = $connection->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);  // "i" for integer
$stmt->execute();
$result = $stmt->get_result();
?>

說明

  • 準備好的語句將 SQL 查詢與資料分開,防止惡意程式碼注入。
  • bind_param 將 $user_id 綁定到 SQL 語句,不允許直接輸入修改查詢結構。

2. 防止跨站腳本(XSS)

當攻擊者將惡意腳本注入其他使用者檢視的網頁時,就會發生 XSS。為了避免這種情況,請始終對輸出進行清理和編碼

範例

<?php
// Insecure version
echo "<p>Welcome, " . $_GET['username'] . "</p>";

// Secure version
echo "<p>Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "</p>";
?>

說明

  • htmlspecialchars 將特殊字元(如 )轉換為 HTML 實體,中和使用者輸入中嵌入的任何腳本。
  • ENT_QUOTES 轉義單引號和雙引號,使 HTML 屬性中的輸出更安全。

3. 防止跨站請求偽造(CSRF)

當攻擊者誘騙使用者在使用者不知情的情況下在網站上執行操作時,就會發生 CSRF。透過使用令牌來防止CSRF。

範例

<?php
// Generate CSRF token
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Add token to form
echo '<form method="POST" action="submit.php">';
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
echo '<input type="text" name="data">';
echo '<input type="submit" value="Submit">';
echo '</form>';
?>

在submit.php中:

<?php
session_start();
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF token validation failed.");
}

// Process form data
$data = $_POST['data'];
?>

說明

  • 每個會話都會產生一個唯一的 CSRF 令牌,並作為隱藏欄位新增至表單。
  • 提交表單時,將檢查令牌。如果與儲存的會話令牌不匹配,則請求將被拒絕。

4. 防止會話劫持

保護您的會話以避免會話劫持。這包括設定嚴格的會話配置重新產生會話ID

範例

<?php
session_start();

// Regenerate session ID to avoid fixation attacks
session_regenerate_id(true);

// Configure secure session parameters
ini_set('session.cookie_httponly', 1); // Prevent JavaScript access to session cookies
ini_set('session.cookie_secure', 1);   // Ensure cookies are sent over HTTPS
ini_set('session.use_strict_mode', 1); // Prevent accepting uninitialized session IDs

// Set session timeout
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time
if (time() - $_SESSION['LAST_ACTIVITY'] > 1800) { // 30 minutes timeout
    session_unset();
    session_destroy();
    session_start();
}
?>

說明

  • session_regenerate_id(true) 產生新的會話ID,降低會話固定的風險。
  • 設定 cookie_httponly 和 cookie_secure 有助於透過限制 JavaScript 和不安全(非 HTTPS)存取來防止 cookie 被盜。

5. 安全文件上傳

不受限制的檔案上傳可能會導致惡意檔案上傳並執行。始終驗證文件類型安全地儲存它們

範例

<?php
// Insecure version
$user_id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$user_id'";
$result = mysqli_query($connection, $query);

// Secure version
$user_id = $_GET['id'];
$stmt = $connection->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);  // "i" for integer
$stmt->execute();
$result = $stmt->get_result();
?>

說明

  • 透過根據允許的類型陣列檢查檔案副檔名來僅允許特定的檔案類型。
  • 將檔案儲存在 Web 根目錄之外,並使用 move_uploaded_file 確保無法透過直接 URL 存取它。

6. 使用內容安全策略 (CSP)

CSP 標頭可以透過限制資源載入位置來幫助防止 XSS 和資料注入攻擊。

範例(要加入 .htaccess 檔案或伺服器設定):

<?php
// Insecure version
echo "<p>Welcome, " . $_GET['username'] . "</p>";

// Secure version
echo "<p>Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "</p>";
?>

說明

  • 此 CSP 限制資源僅從同源(自身)加載,並且允許來自 trustscripts.com 的 JavaScript。
  • 這可以防止載入外部腳本或不受信任的資源,從而降低 XSS 風險。

7. 輸入驗證與清理

使用輸入驗證和清理來防止各種類型的注入。

範例

<?php
// Generate CSRF token
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Add token to form
echo '<form method="POST" action="submit.php">';
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
echo '<input type="text" name="data">';
echo '<input type="submit" value="Submit">';
echo '</form>';
?>

說明

  • FILTER_VALIDATE_INT 檢查年齡是否為有效整數。
  • FILTER_SANITIZE_STRING 從使用者名稱中刪除所有 HTML 標籤或特殊字元。

透過實作這些方法,您的 PHP 應用程式將得到更好的保護,免受常見漏洞的影響。保持最新的最佳實踐並對您的程式碼持續應用安全措施非常重要。

與我聯絡:@ LinkedIn 並查看我的作品集。

請給我的 GitHub 專案一顆星 ⭐️

以上是保護您的 PHP 應用程式免受常見漏洞影響的基本安全實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn