在 PHP 中,防御 CSRF(跨站請(qǐng)求偽造)攻擊的主要方法包括以下幾種:
// 生成 CSRF Token
session_start();
$csrf_token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrf_token;
// 在表單中添加隱藏字段
echo '<form action="submit.php" method="post">';
echo<input type="hidden" name="csrf_token" value="' . $csrf_token . '">';
// 其他表單字段...
echo '</form>';
// 驗(yàn)證 CSRF Token
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// 處理表單數(shù)據(jù)
} else {
// 阻止請(qǐng)求
echo "Invalid CSRF Token!";
}
$allowed_origins = ['https://example.com', 'https://subdomain.example.com'];
$referer = isset($_SERVER['HTTP_REFERER']) ? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) : '';
if (in_array($referer, $allowed_origins)) {
// 處理請(qǐng)求
} else {
// 阻止請(qǐng)求
echo "Invalid referer!";
}
setcookie('name', 'value', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict', // 或 'Lax'
]);
結(jié)合以上方法,可以有效地防御 CSRF 攻擊。但請(qǐng)注意,沒(méi)有絕對(duì)安全的系統(tǒng),始終保持警惕和更新防御措施是非常重要的。