ThinkPHP需手动配置CSRF防护:启用think\middleware\ValidateCsrfToken中间件(全局或路由局部注册),模板中用{:csrf_token()}输出__token__隐藏字段,可配置令牌名、过期时间等参数,验证失败抛出ValidateException异常。

ThinkPHP 默认不自动开启 CSRF 防护,需手动配置中间件和模板输出令牌,才能实现表单的 CSRF 令牌验证。
启用 CSRF 中间件
从 ThinkPHP 6.0 开始,CSRF 支持通过内置中间件 think\middleware\ValidateCsrfToken 实现。需在路由或全局中间件中注册:
- 在
app/middleware.php中添加(全局生效):[\think\middleware\ValidateCsrfToken::class] - 或在路由定义中局部启用(推荐用于敏感操作):
Route::post('submit', 'Index/submit')->middleware(\think\middleware\ValidateCsrfToken::class);
在模板中输出隐藏令牌字段
提交表单前,必须在 HTML 表单内插入 CSRF 令牌字段。使用系统提供的 csrf_token() 辅助函数:
- 在模板(如
index.html)中写:<input type="hidden" name="__token__" value="{:csrf_token()}"> - 若使用原生 PHP 模板(.php),可写:
<input type="hidden" name="__token__" value="<?= csrf_token() ?>"> - 注意:字段名默认为
__token__,不可更改;否则中间件无法识别
自定义令牌名称与有效期(可选)
如需调整默认行为,可在 config/app.php 中配置:
立即学习“PHP免费学习笔记(深入)”;
-
'csrf_token' => '__token__':修改令牌字段名(需同步改模板) -
'csrf_expire' => 3600:设置令牌过期时间(秒),默认 7200 秒(2 小时) -
'csrf_var' => 'csrf_token':指定csrf_token()函数生成的 Session 键名(一般无需改动)
验证失败时的行为
当令牌缺失、错误或过期,中间件会抛出 think\exception\ValidateException 异常,默认返回 403 状态码及错误页面。如需自定义响应:
- 在
app/exception/Handle.php中捕获该异常类型 - 或在中间件中继承并重写
handle()方法进行拦截处理 - 开发阶段建议开启调试模式,便于快速定位令牌未输出或重复提交问题



















