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

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

admin7天前AI技术14

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 方案,而不是关掉验证。

相关文章

LLM介绍

。LLM 被证明在使用指令形式化描述的未见过的任务上表现良好。这意味着 LLM 能够根据任务指令执行任务,而无需事先见过具体示例,展示了其强大的泛化能力。 :小型语言模型通常难以解决涉...

Unity 机器学习 基础

ML-Agents 资产导入 Unity 场景创建 Unity 代码部分 Anaconda 执行 rollerball_config.yaml 机器学习逻辑处理...

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

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

从入门到精通:前端开发之骡子快跑支持热点借势吗 骡子快跑节日营销文案生成|Duuu笔记

骡子快跑平台提供五步节日营销文案生成路径:一、调用内置32个节日模板库;二、输入热点事件触发动态生成;三、绑定自有素材库实现个性化延展;四、多角色视角协同输出;五、接入微信生态直发并校验合规性。 ☞...

AI高级应用:Perplexity 怎么写用户手册 Perplexity 产品帮助文档生成【技术】实战案例|Duuu笔记

Perplexity AI用户手册需基于API元数据、真实UI截图、典型场景示例、响应字段解析及动态调试指令五步构建:一调用API获取参数与错误码;二标注网页端搜索框、引用图标等组件;三设计信息检索、...

深入理解前端开发:Minimax视频生成黑科技:复杂动作模拟完全指南|Duuu笔记

为精准模拟复杂动作,需采用分帧提示词构建、骨骼关键点引导注入和多阶段动作蒸馏三法:一、将动作拆解为带空间姿态的关键帧序列并加物理约束;二、注入2D/3D关键点坐标锚定关节位置;三、通过粗生成→特征提取...

发表评论

访客

看不清,换一张

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