繁体   English   中英

Symfony forms 从 AJAX 请求返回 CSRF 令牌无效

[英]Symfony forms returning CSRF token is invalid from AJAX requests

我们有一个 Symfony 4.3 应用程序,它有一个页面可以发出多个 AJAX 请求。 每个 AJAX 响应包含一些 forms 并且每个表单都有自己的 CSRF 令牌。 但是,只有一个 AJAX 调用设法将其令牌存储在 session 中。 因此,AJAX 请求中的所有 forms 都将失败并显示消息

The CSRF token is invalid. Please try to resubmit the form.

除了设法将其令牌正确保存在 session 中的一种形式。

session 存储在 redis 中。

在进行多个 AJAX 调用时,如何确保所有 CSRF 令牌都存储在 session 中?

CSRF 令牌部分使用 cookies。 当您在一页上生成两个 CSRF 并提交 forms 之一时,您使 cookie 无效。

如果没有对框架本身进行一些扩展,我只能看到一种解决方法——而且它相当迂回:

您可以做的是设置一个 controller 来生成您的应用程序表单。

在初始页面加载时,您的 controller 将加载登录表单以及应用程序表单。 通过 AJAX 提交登录表单后,您还将仅为应用程序表单请求 controller(这也将为用户提供一个新的 cookie)。 使用 javascript,您可以从新表单中提取新的 csrf 令牌并将其注入到原始应用程序表单中。 然后,当您提交应用程序表单时,它应该有一个新的、有效的 csrf 令牌。

为了显示:

获取应用程序表单和登录表单 -> 通过 AJAX 提交登录信息 -> 在后台通过 AJAX 获取应用程序表单 -> 窃取新应用程序表单的 csrf 令牌并将其注入第一个应用程序表单 -> 提交应用程序表单。

      $.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  }
});

将此添加到您的标题中->>

<meta name="csrf-token" content="{{ csrf_token() }}">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM