TP6.0 防止重复提交表单的令牌(Token)实战【安全】

陌雪酱_6629

陌雪酱_6629

2026-07-17

785人浏览

原创

必须组合使用Token验证+PRG重定向+缓存控制,缺一不可;需开启token_on、启用Session、前后端Token名称一致、校验后立即redirect跳转新页面,AJAX须通过X-CSRF-TOKEN头传递并手动指定校验名。

tp6.0 防止重复提交表单的令牌(token)实战【安全】

在ThinkPHP 6.0中实现表单防重复提交,必须让前端隐藏域的Token值与后端Session中存储的Token严格匹配且一次性生效——只要页面缓存、多标签页、AJAX头缺失或redirect位置错误,整个机制就会失效。

开启并配置Token验证

打开config/app.php,找到'middleware'数组,在其中加入\think\middleware\TokenCheck::class中间件(TP6.0默认未启用该中间件)。

在config/app.php中设置以下三项:

【'token_on' => true】 —— 必须设为true,否则{:token()}不生成、$request->checkToken()永远返回true;

'token_name' => '__token__' —— 保持默认即可,若修改需前后端同步;

'token_type' => 'sha256' —— 建议从默认md5升级为sha256,避免碰撞风险。

模板中插入Token字段

方法一:直接使用内置函数生成隐藏域

方法二:一键输出完整字段(含name和value)

{:token_field()}

方法三:自定义名称与哈希方式(如需区分登录/支付表单)

{:token_field('__login_token__', 'sha1')} —— 此时控制器校验必须用$request->checkToken('__login_token__'),否则校验失败。

【注意:不能在已关闭Session的请求中调用{:token()},会抛出Session未启动异常】

控制器中完成校验与跳转

第一步:确保Session已启动。在控制器构造方法或方法开头加session()->start();,TP6.0默认不自动开启Session。

第二步:在接收POST数据前立即校验Token

$check = $request->checkToken();

第三步:校验失败必须中断流程,不可继续执行业务逻辑

if (false === $check) {<br>     return json(['code'=>403, 'msg'=>'重复提交或令牌无效']);<br>}

第四步:校验通过后,必须用redirect()跳转到新URL,禁止留在原action

redirect('success/index?token='.uniqid()); —— 【跳转地址不能是当前URL(如'index'),否则用户点浏览器刷新会再次POST】

AJAX提交时的特殊处理

在HTML头部添加meta标签承载Token:

{:token_meta()} → 渲染为

jQuery AJAX请求头必须显式携带:

headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }

服务端校验需指定名称(因AJAX不走form自动绑定):

$request->checkToken('X-CSRF-TOKEN');

校验通过后,若需刷新Token供下一次AJAX使用,手动调用:

$request->buildToken();

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

14926

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1745

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

4157

3

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2024.03.01

6321

5

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习