【问题标题】:Laravel enable csrf protection on api middlewareLaravel 在 api 中间件上启用 csrf 保护
【发布时间】:2017-10-15 19:52:15
【问题描述】:

我正在开发 Laravel 5.4,我的路由在 api 中间件中

我看到我需要将我的路由转移到 web 中间件,但我需要它们在 api 中间件上,因为我正在创建一个 RESTful api,关于如何 我可以将 csrf 与 api 中间件一起使用吗?

【问题讨论】:

  • 什么版本的 Laravel?
  • 属于哪个中间件组?
  • @Ohgodwhy 我在 Laravel 5.4 上
  • @apokryfos api 中间件

标签: php laravel csrf


【解决方案1】:

确保您的网络中间件组包含以下行,并确保使用相同版本的干净 laravel 安装验证内容。

\App\Http\Middleware\VerifyCsrfToken::class,

并验证路由是否使用 Web 中间件。您可以通过运行 php artisan route:list 进行检查并注意中间件列。

【讨论】:

  • 我在api中间件
  • 默认情况下 csrf 只应用于 web 路由,因为 api 不使用 csrf 令牌。如果你想在你的 api 上强制启用 csrf 检查,那么你可以将 \App\Http\Middleware\VerifyCsrfToken::class, 添加到你的 api 中间件组。
  • 这样做了吗,现在在 POST 上获得“未按请求设置会话存储” -> 添加了这些“\App\Http\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession: :class," 到 api 中间件组。
  • @kdyz 我阅读了您的编辑,这是我的想法。 api 并不意味着使用会话,并且由于 api 通常会使用令牌进行身份验证,因此不需要使用 csrf 令牌。如果 api 在没有任何身份验证的情况下是公开的,那么我认为对这些执行 csrf 检查也没有任何意义,因为任何人都可以使用它。最终,我认为您没有正当理由对 api 强制执行 csrf 检查。
【解决方案2】:

您可以在任何路由组中使用任何中间件以及自定义中间件。 Laravel 让我们很轻松。只需打开 App\Http 命名空间中的 Kernel.php 文件。在第 28 行找到 protected $middlewareGroups probable 并更改如下代码以允许在 api 路由中启用 Csrf 保护:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],
];

【讨论】:

    【解决方案3】:

    CSRF 保护可防止使用先前经过身份验证的用户(通常使用会话设置状态)https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) 进行攻击。

    restful API 没有状态https://en.wikipedia.org/wiki/Representational_state_transfer,因此没有可攻击的会话。因此,在一个 RESTful API 中,CSRF 保护是对每个请求的用户进行身份验证,如果您只在第一个请求上对用户进行身份验证,并为以下请求使用会话,那么您就没有创建一个完整的 API,应该使用 Web 中间件。

    编辑: 如果你没有任何状态,你将如何获取 CSRF 令牌给客户端?

    【讨论】:

    • 是的,没有会话可以攻击,但关键是你将令牌存储在哪里?以及如何保护它免受 XSS 攻击?
    猜你喜欢
    • 2016-09-05
    • 2018-05-27
    • 1970-01-01
    • 2015-04-22
    • 2017-05-04
    • 1970-01-01
    • 2017-01-21
    • 2015-03-11
    • 2014-04-13
    相关资源
    最近更新 更多