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

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

admin2周前 (04-01)AI技术19

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

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

【大模型应用开发

二、大模型的泛化与微调 模型的泛化能力:是指一个模型在面对新的、未见过的数据时,能够正确理解和预测这些数据的能力。在机器学习和人工智能领域,模型的泛化能力是评估模型性能的重要指标之一。...

LLM介绍

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

推荐10个AI人工智能技术网站

除了研究和开发人工智能技术,OpenAI还积极参与人工智能伦理和安全的研究和探讨。 认为,人工智能技术的发展必须遵循伦理和法律的规范,以确保人工智能的应用不会对人类带来负面影响。...

跨平台机器学习:ML.NET架构及应用编程

平台上的一个机器学习框架,它提供了一套丰富的算法和工具,使得开发人员可以轻松地构建和部署机器学习模型。支持多种编程语言,包括等,这使得它成为跨平台机器学习的理想选择。的架构主要包括三个部分:数据读取、...

什么是人工智能 ?

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

发表评论

访客

看不清,换一张

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