Laravel 5+版本CSRF-Token检查方法及自动校验规则咨询
Laravel 5+ 版本CSRF令牌校验规则说明
- 和Laravel 4.X需要手动在控制器内编写CSRF校验逻辑不同,Laravel 5及以上版本的CSRF校验默认由框架自动完成,常规场景下不需要开发者手动写校验代码。
- 框架默认把
VerifyCsrfToken中间件挂载在全局web路由组下,所有走web路由的POST、PUT、PATCH、DELETE类型请求,中间件会自动抓取请求里携带的CSRF令牌,和当前会话存储的合法令牌做比对,校验不通过会直接返回419状态码错误。 - Blade模板里的
@csrf指令本质就是生成一个name为_token的隐藏表单域,值是当前会话绑定的有效CSRF令牌,普通表单提交时这个字段会随表单数据一起发送,能直接被中间件识别校验。也就是说只要你表单里加了@csrf,正常提交不需要做任何额外处理,校验是自动跑的。 - 如果你用AJAX发请求,没法直接取表单里的
_token字段,可以把CSRF令牌写到页面的meta标签里,发请求的时候把令牌放到X-CSRF-TOKEN请求头中,中间件一样能自动识别完成校验,不用额外写适配逻辑。
特殊场景手动校验方法
如果有特殊业务需求(比如部分路由跳过了全局自动校验、自定义接口需要单独做令牌校验),可以直接在控制器里调用框架封装好的方法做校验,不用自己实现令牌比对逻辑,示例代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class FormController extends Controller { public function submit(Request $request) { // 调用框架内置方法校验CSRF令牌有效性 if (!$request->hasValidToken()) { abort(419, 'CSRF令牌校验失败'); } // 往下写正常业务逻辑即可 } }
实用配置提示
- 要是有部分路由不需要做CSRF校验(比如第三方系统调用的webhook回调地址),直接编辑
app/Http/Middleware/VerifyCsrfToken.php文件,把需要跳过校验的路由路径加到$except数组里就行,框架会自动跳过这些路由的CSRF校验流程。 - 非必要不要修改
VerifyCsrfToken中间件的核心校验逻辑,避免引入CSRF防护漏洞。
内容的提问来源于stack exchange,提问作者White Orb
相关产品推荐
相关产品推荐

