php如何防止csrf跨站请求伪造_php生成token嵌入表单与校验方法

使用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 字段输出

示例代码:


接收并校验 Token

当表单提交后,服务器必须检查 POST 数据中的 Token 是否与 Session 中保存的一致。如果不一致或缺失,拒绝请求。

  • 检查 $_POST 是否包含 csrf_token 字段
  • 比对提交的 Token 与 $_SESSION 中存储的值
  • 校验通过后可选择刷新 Token(增强安全性)

submit.php 校验示例:

关键安全建议

为了确保 Token 机制真正有效,注意以下几点:

  • 使用 random_bytes()openssl_random_pseudo_bytes() 生成强随机 Token
  • 使用 hash_equals() 进行比较,避免时序攻击
  • 每个敏感操作(如修改密码、转账)都应校验 Token
  • Token 应绑定用户会话,不可被预测或复用
  • 考虑为不同表单设置不同 Token(如添加 action 标识)

基本上就这些。只要每次提交都经过 Token 校验,就能有效阻断大多数 CSRF 攻击。不复杂但容易忽略细节。