当前位置: 首页 > 面试题库 >

如何在表单的AJAX发布请求中传递CSRF令牌?

赵钊
2023-03-14
问题内容

我正在使用Scala Play!2.6框架,但这可能不是问题。我正在使用他们的Javascript路由-
似乎可以正常工作,但出现了问题。我有一个带有CSRF令牌的表单,在渲染时会产生这种情况:

<form method="post" id="myForm" action="someURL">

<input name="csrfToken" value="5965f0d244b7d32b334eff840...etc" type="hidden">
  <input type="text" id="sometext">
  <button type="submit"> Submit! </button>

</form>

这大概是我的AJAX:

$(document).on('submit', '#myForm', function (event) {

 event.preventDefault();
   var data = {
    textvalue: $('#sometext').val()
   }
 var route = jsRoutes.controllers.DashboardController.postNewProject()
 $.ajax({
    url: route.url,
    type: route.type,
    data : JSON.stringify(data),
    contentType : 'application/json',
    success: function (data) { ...      },
    error: function (data) { ...  }
        })

});

但是,当我发布此消息时,我从服务器返回了未经授权的响应,并且IntelliJ中的控制台告诉我CSRF检查失败。如何在请求中传递CSRF令牌?


问题答案:

好的,经过几个小时的努力,并尝试解密Play上经常出现的主题上下文文档不足的问题,我明白了。

因此,从他们的文档中:

为了对非浏览器请求提供简单保护,“播放”仅检查标头中包含Cookie的请求。如果使用AJAX发出请求,则可以将CSRF令牌放在HTML页面中,然后使用Csrf- Token标题将其添加到请求中。

然后没有代码或示例。谢谢玩。非常具有描述性。无论如何,这是如何:

在你的view.html.formTemplate,你可能会在的IntelliJ写:

@()
<form method="post" id="myForm" action="someURL">

@helper.CSRF.formField  <!-- This auto-generates a token for you -->
  <input type="text" id="sometext">
  <button type="submit"> Submit! </button>

</form>

当交付给客户端时,它将呈现如下所示:

<form method="post" id="myForm" action="someURL">

<input name="csrfToken" value="5965f0d244b7d32b334eff840...etc" type="hidden">
  <input type="text" id="sometext">
  <button type="submit"> Submit! </button>

</form>

好的,几乎到了,现在我们必须创建AJAX调用。我的所有文件都放在一个单独的main.js文件中,但如果需要,也可以将其放在您的文件中view.html.formTemplate

$(document).on('submit', '#myForm', function (event) {

 event.preventDefault();
   var data = {
    myTextToPass: $('#sometext').val()
   }
 // LOOK AT ME! BETWEEN HERE AND
 var token =  $('input[name="csrfToken"]').attr('value')
    $.ajaxSetup({
        beforeSend: function(xhr) {
            xhr.setRequestHeader('Csrf-Token', token);
        }
    });
// HERE
 var route = jsRoutes.controllers.DashboardController.postNewProject()
 $.ajax({
    url: route.url,
    type: route.type,
    data : JSON.stringify(data),
    contentType : 'application/json',
    success: function (data) { ...      },
    error: function (data) { ...  }
        })

});

这行代码: var token = $('input[name="csrfToken"]').attr('value')
您将提取在表单字段中自动生成的CSRF令牌,并在要在Javascript中使用的var中获取其值。

所有AJAX的另一个重要块在这里:

$.ajaxSetup({
            beforeSend: function(xhr) {
                xhr.setRequestHeader('Csrf-Token', token);
            }
        });

使用$.ajaxSetup,您可以设置标题中的内容。这是您从他们的文档中得出的结论:

使用Csrf-Token标头将其添加到请求中。

祝好运!让我知道是否清楚。

注意 :使用lusca时,请使用X-CSRF- Token代替Csrf-Token



 类似资料:
  • 问题内容: 在Cakephp3中,启用Csrf组件时。我如何在ajax调用中使用它。在ajax的此参数中,csrf令牌设置在标头中。什么是价值。由于它给出了错误 未定义csrfToken 另外,如何为某些ajax调用禁用Csrf组件。 问题答案: CSRF组件将当前令牌写入,作为请求参数,您可以通过request objects 方法(或从CakePHP 3.4开始)获取它: 可以通过从控制器事件

  • 我想在点击页面底部时从数据库中检索数据。 现在,我所了解的是: URL。py 视图。py公司 index.html 基本上,它在开始时加载5项,而我试图实现的是,当我到达页面底部时,它会再加载1项。因此jQuery在控制台上工作。日志(“测试”)工作,在我的终端上显示 “获取/加载/HTTP/1.1”200 484 这也很好。 我想我搞砸了ajax不知何故。虽然我不确定。 你可能知道我是个笨蛋,但

  • 我正在尝试通过Ajax从数据库中删除数据。 HTML: 我的ajax代码: 这是我要从数据库中提取数据的查询... 但当我单击“删除链接数据未删除”并显示csrf_token不匹配时...

  • 问题内容: 我想将数组作为Ajax请求发送: 我怎样才能做到这一点? 问题答案: info = []; info[0] = ‘hi’; info[1] = ‘hello’;

  • 我有一个使用ExpressJS构建的NodeJS应用程序。在安全审查之后,有人建议我在所有表单和ajax提交上实现CSRF。为此,我使用了csurf包。为此,我们需要在每个表单页面中传递CSRF令牌,然后将其与表单提交数据一起返回。 首先,我尝试对包含表单的页面单独执行此操作。但后来我意识到我的页面标题中有一个搜索表单,它出现在所有页面上。现在,是否有任何方法可以将CSRF令牌传递给我的所有视图,

  • 我遇到了CodeIgniter/CSRF/JSON的问题。 我正在向PHP后端发送内容类型为“application/json”的http POST请求。有效负载是json数据。我将与数据一起传递生成并存储在CSRF cookie中的CSRF令牌。对于标准POST表单请求,它工作正常,但作为json发送时失败。 由于$\u POST数组因JSON内容类型而为空,CodeIgniter无法验证coo