当前位置:首页 > AI技术 > 正文内容

如何实现Think的表单令牌验证 token标签防CSRF跨站请求伪造机制最佳实践|Duuu笔记

admin7个月前 (04-01)AI技术193

ThinkPHP 的 _token 是基于会话ID、控制器名、操作名、时间戳和密钥加密生成的动态哈希值,由 TokenBuild::build() 生成,经 think\middleware\TokenCheck 校验,但仅在路由或控制器显式启用 token 验证时生效。

ThinkPHP 的

_token

是怎么生成和校验的

ThinkPHP 的表单令牌不是随机字符串,而是基于当前会话 ID、控制器名、操作名、时间戳和密钥拼接后加密生成的哈希值,每次请求都会变化。它默认绑定在 session 中,且只对当前会话有效——换浏览器、清 cookie、重启服务都会导致校验失败。

关键点在于:

_token

值由

TokenBuild::build()

生成,校验逻辑在

think\middleware\TokenCheck

中触发,但**仅当路由或控制器启用了

token

验证规则时才生效**,不是所有 POST 请求自动拦截。

默认不开启全局 token 校验,必须手动配置(如在路由定义中加

['token' => true]

或控制器里用

protected $middleware = [TokenCheck::class];

)

_token

字段名可自定义,但模板中必须和后端配置一致,否则

Request::token()

拿不到值

如果使用 AJAX 提交,

_token

必须显式传入,不能依赖表单自动渲染

模板里写

{:token()}

还是

{:csrf_token()}

ThinkPHP 6.x 只认

{:token()}

,

{:csrf_token()}

是 Laravel 风格,直接写会报错

Undefined function csrf_token

。这个函数本质是调用

think\facade\Form::token()

,输出形如

的 HTML。

必须放在

内部,且不能重复调用,否则多个

_token

字段会导致校验失败

如果表单是动态加载的(比如通过 JS 插入),不能靠模板函数,得用

Url::build('token')

或直接调

Request::token()

获取值再塞进去

若关闭了模板引擎缓存,

{:token()}

每次渲染都生成新值,但页面没刷新前旧表单仍会提交过期 token

POST 提交后提示 “token error” 的常见原因

“token error” 不代表 CSRF 攻击,90% 是开发流程问题。最典型的是:表单渲染后用户停留太久再提交,或者同一账号在多标签页反复打开相同表单页。

独响

一个轻笔记+角色扮演的app

下载

“

PHP免费学习笔记(深入)

”;

session 过期或被回收(如

session.gc_maxlifetime

设得太小),导致服务端找不到对应 token 记录

表单用了 GET 方法提交,而 token 校验中间件默认只检查 POST/PUT/DELETE

前端 JS 修改了

_token

字段值但没同步更新 session 存储的原始 hash(比如复制粘贴表单、用 Postman 手动构造请求)

部署在负载均衡环境却没共享 session 存储(如 Redis 未配置),导致生成 token 和校验 token 落在不同服务器上

绕过或禁用

_token

校验的合理场景

某些接口确实不该走 token 校验,比如第三方回调通知、Webhook 接收、或前后端完全分离且 token 由前端统一管理的项目。这时硬塞

_token

反而增加维护成本。

在路由定义中排除特定 URL:

Route::post('notify', 'NotifyController@handle')->withoutMiddleware(TokenCheck::class);

在控制器方法顶部加注解:

#[WithoutMiddleware(TokenCheck::class)]

(TP6.1+)

不要用

ini_set('session.use_cookies', 0)

或删掉

_token

字段来“绕过”,这会让整个验证机制失效,且掩盖真实问题

真正难处理的是 token 和表单生命周期不匹配——比如一个长表单要填 10 分钟,又不想频繁刷新页面,这时候该考虑用定时刷新 token 的 JS 方案,而不是关掉验证。

相关文章

神经网络分类总结

从网络性能角度可分为连续型与离散型网络、确定性与随机性网络。 从网络结构角度可为前向网络与反馈网络。 从学习方式角度可分为有导师学习网络和无导师学习网络。 按连续突触性...

一文讲清神经网络、BP神经网络、深度学习的关系

人工神经网络中的顶级代表。往往说《神经网络》就是指《BP神经网络》。 大家研究着各种神经网络,研究得不亦乐乎, 来了两个家伙Romelhart 和Mcclelland,...

什么是人工智能 ?

您可以使用 ML 训练 AI,使其精确、快速地执行任务。这可以通过自动化员工感到吃力或厌烦的业务部分来提高运营效率。同样,您可以使用 AI 自动化来腾出员工资源,用于更复杂和更具创造性的工作。...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

深入理解优化:如何利用 Gemini 3.1 的阶梯计费策略?企业级大规模调用实务完全指南|Duuu笔记

需深入理解Gemini 3.1阶梯计费与调用联动关系,通过识别阶梯区间、请求级Token预估截断、多模型路由调度、响应缓存去重、项目拆分配额绑定五种路径优化成本。 ☞☞☞AI 智能聊天, 问答助手,...

AI核心技巧:如何重置openclaw硬件设置 openclaw恢复出厂设置操作方法【操作】深度解析|Duuu笔记

重置 OpenClaw 配置有四种方法:一、交互式向导重置(openclaw onboard --reset);二、指定作用域的命令行重置(如--reset-scope config);三、手动删除~...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。