CSRF攻击:
CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。
Laravel 会自动生成一个 CSRF token 给每个用户的 Session。该 token 用来验证用户是否为实际发出请求的用户。
可以使用 csrf_field 辅助函数来生成一个包含 CSRF token 的 _token 隐藏表单字段:
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
1>可以在 Blade模板引擎中使用:
{{ csrf_field() }}
或者使用原生写法
<?php echo csrf_field(); ?>
你不需要手动验证 POST、PUT 或 DELETE 请求的 CSRF token。VerifyCsrfToken HTTP 中间件将自动验证请求与 session 中的 token 是否相符。
2>在 Laravel VerifyCsrfToken 中间件也会检查请求标头中的 X-CSRF-TOKEN。
例如,你可以将其保存在 meta 标签中:
<meta name="csrf-token" content="{{ csrf_token() }}">
一旦你创建了 meta 标签,你就可以使用 jQuery 之类的函数库将 token 加入到所有的请求标头。基于 AJAX 的应用,提供了简单、方便的 CSRF 保护:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
3>Laravel 也会在 XSRF-TOKEN cookie 中保存 CSRF token。
你也可以使用 cookie 的值来设置 X-XSRF-TOKEN 请求标头。一些 JavaScript 框架会自动帮你处理,例如:Angular。你不大可能会需要手动去设置这个值。
4>有时候希望一组 URIs 不要被 CSRF 保护。
可以在 VerifyCsrfToken 中间件中增加 $except 属性来排除 URIs:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * URIs 应被 CSRF 验证执行。 * * @var array */ protected $except = [ 'stripe/*', ]; }