多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # CSRF 保护 ## 介绍 web 中间件组的`VerifyCsrfToken`中间件自动验证请求里的令牌是否与存储在会话中令牌匹配。 ``` // 使用`@csrf`Blade 指令来生成令牌字段 <form method="POST" action="/profile"> @method('PUT') @csrf </form> <form method="POST" action="/profile"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> </form> ``` ## CSRF 白名单 可以把路由放`routes/web.php`外,或者可以通过将 URL 添加到`VerifyCsrfToken`中间件的`$except`属性排除路由的 CSRF 保护,如下所示: <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'stripe/*', 'http://example.com/foo/bar', 'http://example.com/foo/*', ]; } >[success] 当运行测试时, CSRF 中间件会自动禁用。 ## X-CSRF-TOKEN 除了检查 POST 参数中的 CSRF 令牌外,`VerifyCsrfToken`中间件还会检查`X-CSRF-TOKEN`请求头。应该将令牌保存在 HTML `meta` 标签中,如下: ``` <meta name="csrf-token" content="{{ csrf_token() }}"> ``` 然后,一旦你创建了`meta`标签,就可以指示像 jQuery 这样的库自动将令牌添加到所有请求的头信息中。还可以为基于 AJAX 的应用提供简单,方便的 CSRF 保护。如下: ``` $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); ``` >[danger] 默认`resources/js/bootstrap.js`文件会用 Axios HTTP 函数库注册 `csrf-token` meta 标签中的值。如果不使用这个函数库,则需要手动设置。 ## X-XSRF-TOKEN Laravel 将当前的 CSRF 令牌存储在一个`XSRF-TOKEN`cookie 中,该 cookie 包含在框架生成的每个响应中。可以使用 cookie 值来设置 `X-XSRF-TOKEN`请求头。 这个 cookie 主要是作为一种方便的方式发送的,因为一些 JavaScript 框架和库,例如 Angular 和 Axios ,会自动将它的值放入`X-XSRF-TOKEN`头中。