使用token机制可有效防止csrf攻击:先在表单中嵌入通过random_bytes生成并存于session的随机token,提交时用hash_equals比对post数据与session中的token是否一致,校验通过后处理业务逻辑并可选清除token,确保请求来自可信源。

防止 CSRF(跨站请求伪造)攻击,核心思路是验证请求是否来自可信的源。PHP 中最常用、有效的方法是使用 Token 机制:在表单中嵌入一个一次性令牌(Token),提交时在服务器端校验该 Token 是否合法。
生成并嵌入 Token 到表单
每次展示表单前,生成一个唯一的随机 Token,并将其保存在 Session 中,同时以隐藏字段的形式插入到 HTML 表单里。
- 启动 Session,确保用户上下文可用
- 使用加密安全的函数生成随机字符串作为 Token
- 将 Token 存入 $_SESSION,并在表单中添加 hidden 字段输出
示例代码:
<strong><?php
session_start();
// 生成 Token
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<form method="POST" action="submit.php">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>" />
<input type="text" name="username" />
<button type="submit">提交</button>
</form></strong>
接收并校验 Token
当表单提交后,服务器必须检查 POST 数据中的 Token 是否与 Session 中保存的一致。如果不一致或缺失,拒绝请求。
立即学习“PHP免费学习笔记(深入)”;
- 检查 $_POST 是否包含 csrf_token 字段
- 比对提交的 Token 与 $_SESSION 中存储的值
- 校验通过后可选择刷新 Token(增强安全性)
submit.php 校验示例:
<strong><?php
session_start();
// 验证请求方法
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die('非法请求');
}
// 检查 Token 是否存在
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die('CSRF 校验失败,请求不合法');
}
// 清除 Token(可选,防止重放)
unset($_SESSION['csrf_token']);
// 处理业务逻辑
echo "数据提交成功";
?></strong>
关键安全建议
为了确保 Token 机制真正有效,注意以下几点:
- 使用 random_bytes() 或 openssl_random_pseudo_bytes() 生成强随机 Token
- 使用 hash_equals() 进行比较,避免时序攻击
- 每个敏感操作(如修改密码、转账)都应校验 Token
- Token 应绑定用户会话,不可被预测或复用
- 考虑为不同表单设置不同 Token(如添加 action 标识)
基本上就这些。只要每次提交都经过 Token 校验,就能有效阻断大多数 CSRF 攻击。不复杂但容易忽略细节。











