php框架csrf防护需手动配置生成、注入、传输、验证四环节,thinkphp推荐路由层设['token'=>true],ci4须注册csrf过滤器,laravel默认联动@csrf与中间件,通用要求包括token绑定session、三重校验及验证后销毁。

PHP框架中的CSRF防护不是“开个开关就自动生效”的功能,必须明确配置生成、注入、传输和验证四个环节。多数框架默认不启用校验,表单里出现隐藏token字段,只说明你调用了生成函数,不代表后端真在检查它。
ThinkPHP:路由层配 token 最可靠
ThinkPHP 6.x 的 CSRF 校验默认关闭,{@ValidateToken}注解或控制器中间件容易遗漏或失效,推荐在路由定义时直接加 ['token' => true]:
- POST 路由必须显式开启,GET 不需要(CSRF 只针对状态变更请求)
- 资源路由(如
Route::resource('user', 'UserController'))不会自动继承 token 配置,需单独为store和update方法设置 - 子域名或分组路由中若使用了空中间件数组(如
->middleware([])),会清空继承的 TokenCheck,导致防护失效
CodeIgniter:过滤器注册是关键一步
CI4 中仅修改 Security.php 的 $csrfProtection 参数毫无作用,必须在 Filters.php 的 $globals['before'] 中注册 csrf 过滤器:
- 全局启用:
$globals = ['before' => ['csrf']] - 按方法控制:设
$methods['post'] = ['csrf'],再配合路由 filter 显式绑定 - 注意顶部是否已引入
use CodeIgniter\Filters\CSRF;,否则类名解析失败,过滤器静默跳过
Laravel:Blade 指令 + 中间件默认联动
Laravel 是少数默认开启 CSRF 防护的主流框架,@csrf 指令生成的 _token 字段会由 VerifyCsrfToken 中间件自动校验:
- 所有 POST/PUT/PATCH/DELETE 表单都应包含
@csrf或{{ csrf_field() }} - AJAX 请求需在请求头中携带
X-CSRF-TOKEN,值来自meta[name="csrf-token"]的 content 属性 - 验证失败返回 419 状态码,不抛异常、不跳转,前端需监听该状态并刷新页面或重取 token
通用注意事项:别让防护形同虚设
无论用哪个框架,以下三点不满足,CSRF 防护就等于没开:
-
token 必须绑定当前用户 session,不能存 cookie 或前端可读位置;生成要用
random_bytes(),禁用mt_rand()或时间戳 - 验证必须三重检查:请求方法是否为 POST/PUT/DELETE、token 字段是否存在、值是否与 session 中一致且未过期(建议带时间戳存储)
-
验证成功后立即销毁 session 中的 token(
unset($_SESSION['csrf_token'])),防止重放;如需支持多表单,改用独立键名(如csrf_token_profile)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











