原生php实现csrf
原生 PHP 实现 CSRF 防护
CSRF(跨站请求伪造)是一种常见的网络攻击方式,通过伪造用户请求执行非预期操作。以下是在原生 PHP 中实现 CSRF 防护的几种方法:
生成 CSRF Token
在会话中生成一个唯一的令牌,并将其嵌入表单或请求中:
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
在表单中嵌入 Token
将生成的令牌作为隐藏字段添加到表单中:
<form action="process.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<!-- 其他表单字段 -->
<input type="submit" value="提交">
</form>
验证 CSRF Token
在处理表单提交时,验证令牌是否匹配:

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF 验证失败');
}
// 处理合法请求
}
为 AJAX 请求添加 Token
对于 AJAX 请求,可以将令牌添加到请求头中:
var xhr = new XMLHttpRequest();
xhr.open('POST', 'api.php', true);
xhr.setRequestHeader('X-CSRF-Token', '<?php echo $_SESSION['csrf_token']; ?>');
xhr.send(formData);
服务器端验证:

if ($_SERVER['HTTP_X_CSRF_TOKEN'] !== $_SESSION['csrf_token']) {
http_response_code(403);
exit;
}
令牌刷新策略
每次使用后刷新令牌可以增强安全性:
// 验证成功后刷新令牌
unset($_SESSION['csrf_token']);
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
同源检查
补充检查请求来源可以增加防护:
$allowedOrigins = ['https://yourdomain.com'];
if (isset($_SERVER['HTTP_ORIGIN']) && !in_array($_SERVER['HTTP_ORIGIN'], $allowedOrigins)) {
die('非法请求来源');
}
设置 Cookie 的 SameSite 属性
通过设置 Cookie 的 SameSite 属性可以防止 CSRF:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.yourdomain.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
session_start();
这些方法可以单独使用,但组合使用会提供更强的安全性。实现时需根据具体应用场景选择适合的方案。






