如何现Think的表单令牌验证 token标签防CSRF跨站请求伪造机制最佳践|Duuu笔记
在生产环境中优化PHP,本文分析
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。
必须放在
