php实现csrf
PHP 实现 CSRF 防护的方法
CSRF(跨站请求伪造)是一种常见的网络攻击方式,攻击者通过伪造用户的请求来执行非预期的操作。在 PHP 中可以通过以下方法实现 CSRF 防护:
生成 CSRF Token
在用户会话开始时生成一个唯一的 Token,并将其存储在 Session 中:
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']; ?>">
<!-- 其他表单字段 -->
<input type="submit" value="提交">
</form>
验证 CSRF Token

在处理表单提交时,验证 Token 是否匹配:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF 验证失败');
}
// 验证通过,处理表单数据
}
AJAX 请求中的 CSRF 防护
对于 AJAX 请求,可以将 Token 放在请求头中:
var xhr = new XMLHttpRequest();
xhr.open('POST', 'process.php', true);
xhr.setRequestHeader('X-CSRF-Token', '<?php echo $_SESSION['csrf_token']; ?>');
xhr.send(formData);
然后在 PHP 中验证:

if ($_SERVER['HTTP_X_CSRF_TOKEN'] !== $_SESSION['csrf_token']) {
die('CSRF 验证失败');
}
Token 过期机制
可以设置 Token 的有效期,增加安全性:
if (empty($_SESSION['csrf_token_expire']) || time() > $_SESSION['csrf_token_expire']) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
$_SESSION['csrf_token_expire'] = time() + 3600; // 1小时后过期
}
同源策略检查
检查请求的来源是否与预期一致:
$allowedOrigins = ['https://yourdomain.com'];
if (isset($_SERVER['HTTP_ORIGIN']) && !in_array($_SERVER['HTTP_ORIGIN'], $allowedOrigins)) {
die('非法请求来源');
}
这些方法可以有效地防护 CSRF 攻击,建议根据实际需求组合使用。






