htmlspecialchars()是一個用於防止XSS(跨站腳本攻擊)的函數。它的作用是將HTML 中的特殊字符(如< 、 > 、 " 、 & )轉換為HTML 實體,避免用戶提交的惡意腳本在頁面中被執行。例如:
<?php
$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>
輸出結果為:
<script>alert("XSS")</script>
這段代碼有效防止了HTML 中註入惡意JavaScript,但這與CSRF 攻擊的防禦幾乎沒有直接關係。
CSRF 利用的是用戶的“已登錄狀態”。攻擊者誘導用戶點擊一個鏈接或訪問一個圖片/iframe,利用用戶當前在某個網站的登錄狀態發起請求。例如:
<img src="https://m66.net/delete_account.php" />
如果用戶在m66.net已登錄,且服務器未做任何驗證,這個請求可能會真的刪除用戶賬戶。
這種攻擊的關鍵是:用戶不知情地發起了一個狀態改變的請求,並且服務器信任了這個請求。
htmlspecialchars()作用於“輸出階段”,主要是防止瀏覽器解析惡意腳本。而CSRF 攻擊是通過用戶瀏覽器自動或誘導發起的請求,即便頁面沒有任何輸出也可能被觸發。
換句話說,CSRF 是“偽裝用戶身份的請求”,與輸出內容是否經過轉義沒有關係。因此, htmlspecialchars()並不能防止CSRF 攻擊。
使用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("非法請求!");
}
// 執行更新操作
}
?>
驗證Referer 或Origin 頭
儘管不能完全依賴,但在某些場景下可以輔助判斷請求是否合法。例如:
<?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (parse_url($referer, PHP_URL_HOST) !== 'm66.net') {
die("來源不合法");
}
?>
使用SameSite Cookie 屬性
現代瀏覽器支持通過設置SameSite=Strict或SameSite=Lax的Cookie 屬性,防止第三方請求攜帶Cookie:
setcookie('session_id', $value, [
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);