【问题标题】:Laravel CSRF on second (third, etc.) ajax requestLaravel CSRF 处理第二个(第三个等)ajax 请求
【发布时间】:2020-10-23 21:18:14
【问题描述】:

在 laravel 应用程序中,我有一个通过 javascript 提交的表单。我将{{ csrf_field() }} 添加到表单中,我正在使用VerifyCsrfToken 中间件。

第一个请求工作正常且符合预期。但是,如果我不刷新页面并重新发送相同的表单(例如由于表单字段验证错误),我的请求会收到 419 错误。我认为这是因为 _token 在两个请求中都是相同的,并且在第一个请求中失效了。

有没有办法防止 csrf 令牌在请求中失效,以便我可以在需要时重复使用它?

【问题讨论】:

  • 您在请求的标头或表单/数据中添加了csrf?
  • 表单数据中(使用{{ csrf_field() }}

标签: laravel laravel-middleware


【解决方案1】:

如果您没有使用 Axios HTTP 库(它包含在 bootstrap.js 文件中),您将需要从收到的上一个请求的 cookie 中手动更新 CSRF 令牌。

resources/js/bootstrap.js 文件中提供的 Axios HTTP 库使用加密的 XSRF-TOKEN cookie 的值自动发送 X-XSRF-TOKEN 标头。如果您不使用此库,则需要为您的应用程序手动配置此行为。

--编辑-- 由于您的页面是缓存和静态的。要么丢失缓存,要么丢失 CSRF 在app\Http\Kernel.php 中注释中间件VerifyCsrfToken 的行

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, <--- THIS ONE
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\CheckBlocked::class,
    ],

];

【讨论】:

  • 那不是一个真正的选择。我的页面都是 Laravel 生成的静态(缓存)html 文件。所以 user1 和 user2 得到的是同一个 HTML 文件。只是表单根据用户会话由js注入
  • @bernhardh 您省略了准确说明您的页面在请求中是静态的。编辑了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2020-07-02
  • 2017-05-22
  • 2017-10-16
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多