php csrf实现
PHP 中 CSRF 防护的实现
CSRF(跨站请求伪造)是一种常见的网络攻击方式,攻击者诱导用户在不知情的情况下提交恶意请求。以下是 PHP 中实现 CSRF 防护的几种方法:
生成 CSRF Token
在用户会话中生成一个唯一的 Token,并将其嵌入表单或请求中:
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
在表单中嵌入 Token
将生成的 Token 作为隐藏字段添加到表单中:

<form action="process.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<!-- 其他表单字段 -->
</form>
验证 Token
在处理表单提交时,验证 Token 是否匹配:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF token validation failed');
}
// 处理表单数据
}
使用 SameSite Cookie 属性
设置 Cookie 的 SameSite 属性为 Strict 或 Lax,限制跨站请求:

session_set_cookie_params([
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
session_start();
双重提交 Cookie 验证
除了表单中的 Token,还可以在 Cookie 中设置相同的 Token 值,服务器端验证两者是否一致:
setcookie('csrf_cookie', $_SESSION['csrf_token'], [
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
// 验证时检查
if ($_POST['csrf_token'] !== $_COOKIE['csrf_cookie']) {
die('CSRF validation failed');
}
定期更新 Token
为增强安全性,可以定期更新 CSRF Token:
if (isset($_SESSION['csrf_token'])) {
unset($_SESSION['csrf_token']);
}
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
这些方法可以单独使用或组合使用,根据应用的安全需求选择合适的防护级别。实现时应注意 Token 的随机性和保密性,确保每个会话都有唯一的 Token。






