简介
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 中文文档》