为 VerifyCsrfToken 添加过滤条件

问题

Laravel 默认情况下会对所有的 POST 请求进行 CSRF 过滤,但是有时候你想让一些请求跳过 CSRF 检查,例如你提供的 API 。

什么是 CSRF?

CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

CSRF 不通过会报以下错误:

TokenMismatchException in VerifyCsrfToken.php line 45

解决

修改 app/Http/Middleware/VerifyCsrfToken.php 文件:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
use Closure;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];

    public function handle($request, Closure $next)
    {
        // 如果是来自 api 域名,就跳过检查
        if ($_SERVER['SERVER_NAME'] != config('api.domain'))
        {
            return parent::handle($request, $next);
        }

        return $next($request);
    }
}

summer

摈弃世俗浮躁,追求技术精湛
Summer
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7
Destiny

很有用, api请求会非常多, 用了这个妈妈就不用担心我的学习了

7年前 评论

请教这和写在 $except 中有什么区别?

7年前 评论
hareluya

同问,似乎except也是起到一样的作用啊。

7年前 评论
Summer

@隔壁老王
@hareluya 是一样的。这个栗子选的不好,handle 里面可以写逻辑代码,做更复杂的判断。我已经修改了实例代码,感谢指出

7年前 评论
hareluya

@Summer 这个例子赞。。。。

7年前 评论

5.2+ 中间件支持分组,在 api 分组中不添加该中间件即可 :smile:

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!