首页 » Laravel 5.3 中文文档 » 正文

「Laravel 5.3 中文文档」HTTP 层 – CSRF 保护

简介

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 中文文档

发表评论