在Web應用中,會話(Session)是追踪用戶狀態和存儲信息的重要手段。但由於Web環境的開放性,會話數據容易遭受跨域攻擊。本文將分享PHP中常見且實用的防護技巧,並附具體代碼示例。
Session ID通常保存在Cookie中,為防止跨域攻擊,可通過調整Cookie屬性增強安全性。主要涉及:
示例代碼:
session_start(); <p>// 獲取當前Cookie參數<br> $cookieParams = session_get_cookie_params();</p> <p>// 設置安全的Cookie屬性<br> session_set_cookie_params(<br> $cookieParams["lifetime"],<br> $cookieParams["path"],<br> $cookieParams["domain"],<br> true, // Secure<br> true // HttpOnly<br> );</p> <p>$_SESSION["username"] = "user123";</p> <p>session_write_close();<br>
通過檢查請求的來源域名,確保Session操作只發生在授權域名下,降低跨域攻擊風險。可利用$_SERVER['HTTP_REFERER']實現:
if (isset($urlParts['host']) && $urlParts['host'] === $allowedDomain) {
return true;
} else {
return false;
}
}
// 使用示例
if (validateReferer("example.com")) {
// 執行會話相關操作
} else {
// 非法來源,拒絕訪問或提示錯誤
}
為每個會話生成唯一Token,客戶端請求時攜帶,服務器端驗證Token一致性,防止偽造請求:
// 生成Token function generateToken() { $token = bin2hex(random_bytes(32)); $_SESSION["csrf_token"] = $token; return $token; } <p>// 驗證Token<br> function validateToken($token) {<br> return isset($_SESSION["csrf_token"]) && $_SESSION["csrf_token"] === $token;<br> }</p> <p>// 生成Token並輸出到表單中<br> $token = generateToken();</p> <p>echo '<form method="post"> ';<br> echo '<input type="hidden" name="csrf_token" value="' . $token . '"> ';<br> echo '<input type="submit" value="Submit"> ';<br> echo '</form> ';</p> <p>// 在請求處理處驗證<br> if (isset($_POST["csrf_token"]) && validateToken($_POST["csrf_token"])) {<br> // Token有效,執行操作<br> } else {<br> // Token無效,拒絕操作<br> }<br>
通過合理設置Cookie屬性、驗證請求來源域以及採用Token機制,可以有效防護PHP Session的跨域攻擊風險。建議在實際開發中結合具體業務場景,持續關注安全漏洞並及時更新策略,確保用戶數據和隱私安全。