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

jQuery将CSRF令牌添加到所有$ .post()请求的数据中

丁雅惠
2023-03-14
问题内容

我正在使用Laravel 5应用程序,该应用程序默认为所有POST请求启用CSRF保护。我喜欢这种增加的安全性,因此我正在尝试使用它。

发出简单$.post()请求时,我收到一个'Illuminate\Session\TokenMismatchException'错误,因为_tokenPOST数据中缺少所需的表单输入。这是一个有关$
.post请求的示例:

var userID = $("#userID").val();
$.post('/admin/users/delete-user', {id:userID}, function() {
// User deleted
});

我将CSRF令牌存储为标头中的meta字段,可以使用以下命令轻松访问它:

var csrf_token = $('meta[name="csrf-token"]').attr('content');

是否可以在所有传出$.post()请求中将其附加到json数据?我尝试使用标头,但Laravel似乎无法识别它们-

var csrf_token = $('meta[name="csrf-token"]').attr('content');
alert(csrf_token);
$.ajaxPrefilter(function(options, originalOptions, jqXHR){
    if (options['type'].toLowerCase() === "post") {
        jqXHR.setRequestHeader('X-CSRFToken', csrf_token);
    }
});

问题答案:

您的$.ajaxPrefilter方法是一种很好的方法。但是,您不需要添加标题。您只需要在data字符串中添加一个属性。

数据作为的第二个参数提供$.post,然后id=foo&bar=baz&...在预过滤器访问data选项之前格式化为查询字符串()。因此,您需要在查询字符串中添加自己的字段:

var csrf_token = $('meta[name="csrf-token"]').attr('content');
$.ajaxPrefilter(function(options, originalOptions, jqXHR){
    if (options.type.toLowerCase() === "post") {
        // initialize `data` to empty string if it does not exist
        options.data = options.data || "";

        // add leading ampersand if `data` is non-empty
        options.data += options.data?"&":"";

        // add _token entry
        options.data += "_token=" + encodeURIComponent(csrf_token);
    }
});

这将id=userID变成id=userID&_token=csrf_token



 类似资料:
  • 我试图创建一个带有动态预填充字段的Django表单:也就是说,当从下拉菜单中选择一个字段()时,其他字段会自动预填充相应的数据。为此,我希望在选择下拉选项后立即向服务器发送POST请求。 到目前为止,我已经尝试了以下模板(以下https://docs.djangoproject.com/en/2.0/ref/csrf/): 但是,当我选择一个下拉选项时,我会得到一个 新:17未捕获的语法错误:意外

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

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

  • 问题内容: 我试图通过ajax从数据库中删除数据。 HTML: 我的ajax代码: 这是我从数据库中获取数据的查询… 但是当我单击删除链接数据未删除并显示csrf_token不匹配… 问题答案: 您必须在ajax请求中添加 数据 。我希望这样会有用。

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

  • 我正在开发一个应用程序与Django后端和Next.js前端。我试图使用提取API将数据从前端发布到后端。我有问题传递一个有效的CSRF令牌在我的POST数据到Django。 我试图通过在POST请求中包含一个X-CSRFToken头并使用Django文档中推荐的JavaScript Cookie库获取其值来实现这一点。 这是我的提取请求: 我从Django那里得到的错误当然是说没有设置CSRF