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

絕刀狂花
发布: 2025-11-26 20:45:47
原创
152人浏览过
使用Token机制可有效防止CSRF攻击:先在表单中嵌入通过random_bytes生成并存于session的随机Token,提交时用hash_equals比对POST数据与session中的Token是否一致,校验通过后处理业务逻辑并可选清除Token,确保请求来自可信源。

php如何防止csrf跨站请求伪造_php生成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免费学习笔记(深入)”;

Glean
Glean

Glean是一个专为企业团队设计的AI搜索和知识发现工具

Glean 117
查看详情 Glean
  • 检查 $_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 攻击。不复杂但容易忽略细节。

以上就是php如何防止csrf跨站请求伪造_php生成token嵌入表单与校验方法的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号