简介
Laravel 提供简单的方法保护你的应用程序不受到 跨站请求伪造(CSRF) 攻击。跨站请求伪造是一种挟制当前已登录的用户在 Web 应用程序上执行非本意的操作的攻击方法。
Laravel 自动为每一个被应用管理的活跃用户 session 生成一个 CSRF “token”,该 token 用来验证用户是否为实际发出请求的用户。
任何时间你在 Laravel 应用中定义的 HTML 表单,你都需要在表单中包含一个 CSRF token 隐藏域,以便 CSRF 保护中间件可以验证这个请求。你可以使用 csrf_field
辅助方法来生成 token 隐藏域:
<form method="POST" action="/profile"> {{ csrf_field() }} ... </form>
位于 web
中间件组中的 VerifyCsrfToken
中间件会自动验证请求中的 token 是否与存储在 session 中的 token 一致。
从 CSRF 保护中排除 URIs
有时候你可能希望从 CSRF 保护中排除一些 URIs。例如你正在使用 Stripe 来处理支付,并利用它们的 webhook 系统,你需要从 CSRF 保护中排除你的 Stripe webhook 处理路由,因为 Stripe 不知道给你的路由发送什么 CSRF token。
一般情况下你需要把这类路由放到 web
中间件组外,而 RouteServiceProvider
已经把它应用到 routes/web.php
文件中的所有路由上。然而,你可以把它们的 URIs 添加到 VerifyCsrfToken
中间件的 $except
属性中来排除它们:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * 这些 URIs 将不会进行 CSRF 验证 * * @var array */ protected $except = [ 'stripe/*', ]; }
X-CSRF-TOKEN
除了把 CSRF token 作为 POST 参数验证外,VerifyCsrfToken
中间件也使用 X-CSRF-TOKEN
请求头进行验证。例如,你可以把这个 token 存放在 HTML 的 meta
标签中:
<meta name="csrf-token" content="{{ csrf_token() }}">
当你创建了 meta
标签后,你可以使用 jQuery 之类的函数库自动将 token 加入到所有的请求头。这为你基于 AJAX 的应用提供了一个简单、方便的方式进行 CSRF 保护:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
X-XSRF-TOKEN
Laravel 把当前 CSRF token 存储在 XSRF-TOKEN
cookie 中,它包含着由框架生成的每一个响应中。你可以使用这个值来设置 X-XSRF-TOKEN
请求头。
这个 cookie 主要是作为一种方便的方式,因为一些 JavaScript 框架,如 Angular,会自动把它的值放到 X-XSRF-TOKEN
头中。
该篇属于专题:《Laravel 5.3 中文文档》