要防止PHP中的跨站請求偽造(CSRF)攻擊,可以采取以下幾種方法:
// 生成CSRF令牌
session_start();
$csrf_token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrf_token;
// 在表單中包含CSRF令牌
<form action="submit.php" method="post">
<!-- 其他表單字段 -->
<input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?>">
<input type="submit" value="提交">
</form>
// 驗證CSRF令牌
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
// 令牌不匹配,拒絕請求
die("Invalid CSRF token.");
}
// 繼續處理表單數據
}
Content-Security-Policy
來實現。header('Content-Security-Policy: default-src \'self\'');
// 設置CSRF令牌cookie
session_start();
$csrf_token = bin2hex(random_bytes(32));
setcookie('csrf_token', $csrf_token, 0, '/');
$_SESSION['csrf_token'] = $csrf_token;
// 在表單中包含CSRF令牌
<form action="submit.php" method="post">
<!-- 其他表單字段 -->
<input type="hidden" name="csrf_token" value="<?php echo $_COOKIE['csrf_token']; ?>">
<input type="submit" value="提交">
</form>
// 驗證CSRF令牌
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
// 令牌不匹配,拒絕請求
die("Invalid CSRF token.");
}
// 繼續處理表單數據
}
setcookie('csrf_token', $csrf_token, 0, '/', '', false, true);
結合以上方法,可以有效地防止PHP中的CSRF攻擊。