首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >jQuery向所有$.post()请求的数据添加CSRF令牌

jQuery向所有$.post()请求的数据添加CSRF令牌
EN

Stack Overflow用户
提问于 2015-02-10 03:32:42
回答 3查看 86.8K关注 0票数 33

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

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

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

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

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);
    }
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-10 03:48:29

您的$.ajaxPrefilter方法是一个很好的方法。不过,您不需要添加标头;您只需要向data字符串添加一个属性。

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

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

票数 33
EN

Stack Overflow用户

发布于 2015-11-25 11:50:48

我认为上面的解决方案可能不会起作用。当你这样做的时候:

var x; 
x + ""
// "undefined" + empty string coerces value to string 

您将获得类似于"undefined_token=xxx“的数据

例如,当您使用上面的解决方案来删除laravel时,您必须像这样检查:

if (typeof options.data === "undefined")
    options.data = "";
else
    options.data += "&";
options.data = "_token=" + csrf_token;
票数 0
EN

Stack Overflow用户

发布于 2018-04-09 12:26:01

有一种更简单的方法可以在发送之前序列化数据

<form method="post" id="formData">
 <input type="text" name="name" >
 <input type="hidden" name="_token" value="{{ csrf_token() }}">
 <input type="submit" id="sub" class="btn btn-default" value="Submit" />                            
</form>
<script>
    $(document).on('submit', '#formData', function (event) {
    event.preventDefault();
     var formData = $('#formData').serialize();
    $.ajax({
        url: url,
       type: "POST",
       data : formData,   
                success: function (result) {
                    console.log(result);                             
                }
           });
        });

    });
</script>

名为attr的所有内容都将被放入查询并提交

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28417781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档