gpt4 book ai didi

ajax - Symfony 表单返回 CSRF token 对于 AJAX 请求无效

转载 作者:行者123 更新时间:2023-12-02 19:29:44 24 4
gpt4 key购买 nike

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

CSRF token 无效。请尝试重新提交表单。

除了一种表单能够将其 token 正确保存在 session 中。

session 存储在redis中。

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

最佳答案

CSRF token 部分使用 cookie。当您在一页上生成两个 CSRF 并提交其中一个表单时,您将使 cookie 失效。

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

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

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

举例说明:

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

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

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

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

关于ajax - Symfony 表单返回 CSRF token 对于 AJAX 请求无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58197385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com