php实现csrf
PHP 实现 CSRF 防护的方法
CSRF(跨站请求伪造)是一种常见的网络攻击方式,攻击者利用用户已登录的身份,在用户不知情的情况下执行恶意操作。以下是几种在 PHP 中实现 CSRF 防护的方法:
使用 Token 验证
在表单或请求中嵌入一个随机生成的 Token,并在服务器端验证该 Token 是否匹配。

// 生成 Token 并存储到 Session
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 在表单中嵌入 Token
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
// 验证 Token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF 验证失败');
}
}
使用 SameSite Cookie 属性
设置 Cookie 的 SameSite 属性为 Strict 或 Lax,限制跨站请求携带 Cookie。

session_set_cookie_params([
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
session_start();
检查 Referer 头部
验证请求的来源是否合法,但此方法不完全可靠,因为 Referer 可能被篡改或缺失。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$referer = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
$server = $_SERVER['HTTP_HOST'];
if ($referer !== $server) {
die('CSRF 验证失败');
}
}
使用框架内置的 CSRF 防护
许多 PHP 框架(如 Laravel、Symfony)已内置 CSRF 防护功能。以 Laravel 为例:
// 表单中自动生成 Token
<form method="POST" action="/example">
@csrf
...
</form>
// 中间件自动验证 Token
注意事项
- Token 应具有足够的随机性和长度,避免被猜测。
- Token 应存储在 Session 中,而非 Cookie,防止被窃取。
- 对于敏感操作(如修改密码、支付等),应强制使用 CSRF 防护。
- 定期更新 Token,尤其是用户登录或权限变更时。






