當前位置: 首頁> 最新文章列表> 用htmlspecialchars 防止CSRF 攻擊真的有效嗎?防護原理與使用技巧解析

用htmlspecialchars 防止CSRF 攻擊真的有效嗎?防護原理與使用技巧解析

M66 2025-07-18

htmlspecialchars()的真正用途

htmlspecialchars()是一個用於防止XSS(跨站腳本攻擊)的函數。它的作用是將HTML 中的特殊字符(如<>"& )轉換為HTML 實體,避免用戶提交的惡意腳本在頁面中被執行。例如:

 <?php
$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>

輸出結果為:

 &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;

這段代碼有效防止了HTML 中註入惡意JavaScript,但這與CSRF 攻擊的防禦幾乎沒有直接關係。


CSRF 攻擊原理解析

CSRF 利用的是用戶的“已登錄狀態”。攻擊者誘導用戶點擊一個鏈接或訪問一個圖片/iframe,利用用戶當前在某個網站的登錄狀態發起請求。例如:

 <img src="https://m66.net/delete_account.php" />

如果用戶在m66.net已登錄,且服務器未做任何驗證,這個請求可能會真的刪除用戶賬戶。

這種攻擊的關鍵是:用戶不知情地發起了一個狀態改變的請求,並且服務器信任了這個請求。


htmlspecialchars()無法防止CSRF 的原因

htmlspecialchars()作用於“輸出階段”,主要是防止瀏覽器解析惡意腳本。而CSRF 攻擊是通過用戶瀏覽器自動或誘導發起的請求,即便頁面沒有任何輸出也可能被觸發。

換句話說,CSRF 是“偽裝用戶身份的請求”,與輸出內容是否經過轉義沒有關係。因此, htmlspecialchars()並不能防止CSRF 攻擊。


防禦CSRF 的正確方法

  1. 使用CSRF Token

最有效的方式是在表單中加入隨機生成的CSRF token,並在處理請求時進行驗證。例如:

 <?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form method="POST" action="https://m66.net/update_profile.php">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
    <!-- 其他表單字段 -->
    <button type="submit">提交</button>
</form>
<?php
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        die("非法請求!");
    }
    // 執行更新操作
}
?>
  1. 驗證Referer 或Origin 頭

儘管不能完全依賴,但在某些場景下可以輔助判斷請求是否合法。例如:

 <?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (parse_url($referer, PHP_URL_HOST) !== 'm66.net') {
    die("來源不合法");
}
?>
  1. 使用SameSite Cookie 屬性

現代瀏覽器支持通過設置SameSite=StrictSameSite=Lax的Cookie 屬性,防止第三方請求攜帶Cookie:

 setcookie('session_id', $value, [
    'samesite' => 'Strict',
    'secure' => true,
    'httponly' => true
]);