如何在Laravel中禁用CSRF令牌以及为什么我们必须禁用它?

Bhu*_*ngh 15 laravel

我想知道如何在Laravel中禁用CSRF令牌以及我必须禁用它的位置.禁用它是否很好?

Gau*_*rav 37

您可以通过编辑在少数路径上禁用CSRF.

App\Http\Middleware\VerifyCsrfToken 
Run Code Online (Sandbox Code Playgroud)

并在protected中添加您自己的路由名称

$except = [] array.
Run Code Online (Sandbox Code Playgroud)

这似乎不是一个好习惯,因为通过这样做我们正在删除Laravel的安全功能.

  • @IceFire 通过在 `__construct` 方法中对数组中的每个元素使用 `route` 帮助器,可以非常轻松地 **将路由名称转换为 URI**。 (2认同)

God*_*ard 17

许多人解释了如何做,但他们没有解释 url 应该是什么样子。

编辑 app/Http/Middleware/VerifyCsrfToken.php

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends Middleware
{
    /**
     * Indicates whether the XSRF-TOKEN cookie should be set on the response.
     *
     * @var bool
     */
    protected $addHttpCookie = true;

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        '/user/my_function'
    ];
}
Run Code Online (Sandbox Code Playgroud)

在 $except 数组(); 我们用一个简单的字符串添加一个 url。这通常指向控制器,具体取决于您的路线设置方式。

例如,我的 Controller 文件夹中有一个 UserController.php 文件。我有一个类似的路线。在 web.php 路由文件中。

Route::post('/user', 'UserController@my_function')->name('my_function');
Run Code Online (Sandbox Code Playgroud)

或者,如果您只是因为不知道如何使用 CSRF 而遇到这个问题,并且实际上不需要禁用它,或者除了创建 URL。您可以使用此方法。

如果 app.blade.php 用于 ajax 相关调用,请将这些行添加到您的 app.blade.php 中。

<script>
$(function() {
    $.ajaxSetup({
        headers: {
        'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
        }
    });
});
</script>
Run Code Online (Sandbox Code Playgroud)


Але*_*нер 9

在laravel 7. 打开文件 \App\Http\Middleware\VerifyCsrfToken.php

禁用所有路由

protected $except = [
    '*',
];
Run Code Online (Sandbox Code Playgroud)

禁用某些路由

 protected $except = [
    'mobile/*',
    'news/articles',
];
Run Code Online (Sandbox Code Playgroud)

我搜索了很长时间如何完全禁用 CSRF,有很多相同的例子,但它们没有帮助

  • 不它不是。你应该学会使用它。禁用它永远不应该是一种选择。 (6认同)
  • @rameez的意思是应该的。因为你认为程序员做了“错误”的事情而限制他是荒谬的,也是一种雪花式的编程方法。 (3认同)

tka*_*usl 5

您可以app/http/Kernel.phpweb中间件组中将其禁用。


禁用它是否好?

,不是。阅读有关CSRF维基百科页面,以了解什么是CSRF,CSRF-Token阻止CSRF。


Jon*_*hon 5

CSRF 令牌保护您的应用程序及其用户免受跨站点请求伪造。有关更多信息,请阅读此处:

https://en.wikipedia.org/wiki/Cross-site_request_forgery

令牌通过 Laravel 中的中间件进行验证。如果您查看该文件app/Http/Middleware/VerifyCsrfToken.php,您会看到它为您提供了添加应免于 CSRF 验证的 URL 的选项。

<?php

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}
Run Code Online (Sandbox Code Playgroud)

如果你想完全禁用它,你可以在名为webin的 Middleware 组中找到它app/Http/Kernel.php。这些是默认通过 HTTP 请求触发的中间件。

不过,我不建议在可能的情况下禁用它。