将 CSRFToken 添加到 Ajax 请求

IT技术 javascript jquery ajax
2021-02-01 16:39:13

我需要通过CSRFToken基于 Ajax 的 post 请求,但不确定如何以最佳方式完成。使用内部检查CSRFToken请求的平台(仅 POST 请求)

最初我想将它添加到标题中

$(function() {
    $.ajaxSetup({
        headers : {
            'CSRFToken' : getCSRFTokenValue()
        }
    });
});

这将使其可用于每个 Ajax 请求,但它不适用于我的情况,因为请求CSRFToken仍然为空。

有什么方法可以CSRFToken为所有处理POST类型的Ajax 调用设置

编辑 如果我在我的 Ajax 调用中做这样的事情

data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()},

一切正常。

我的问题是,我想将CSRFToken值作为请求参数而不是作为请求标头传递

6个回答

这个怎么样,

$("body").bind("ajaxSend", function(elm, xhr, s){
   if (s.type == "POST") {
      xhr.setRequestHeader('X-CSRF-Token', getCSRFTokenValue());
   }
});

参考:http : //erlend.oftedal.no/blog/? blogid= 118

CSRF作为参数传递

        $.ajax({
            type: "POST",
            url: "file",
            data: { CSRF: getCSRFTokenValue()}
        })
        .done(function( msg ) {
            alert( "Data: " + msg );
        });
谢谢!!,我知道这种方式,但在那种情况下,这意味着我需要将它添加到我将在我的应用程序中执行的每个 Ajax 调用中
2021-03-31 16:39:13
request.getParameter(CSRF)在您的服务器端。请检查我更新的答案
2021-04-02 16:39:13
是的!您可以使用获取标头响应 csrf 令牌
2021-04-08 16:39:13
谢谢,虽然值正在传递,但它在请求中不可用,这是在服务器端从请求中获取它的方式 request.getParameter(CSRF_PARAM_NAME)
2021-04-13 16:39:13

你可以使用这个:

var token = "SOME_TOKEN";

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  jqXHR.setRequestHeader('X-CSRF-Token', token);
});

从文档:

jQuery.ajaxPrefilter( [dataTypes ], handler(options, originalOptions, jqXHR) )

描述:在发送每个请求之前以及在 $.ajax() 处理它们之前处理自定义 Ajax 选项或修改现有选项。

谢谢!我曾经使用$ .ajaxSetupconfig,并且由于无法识别的 X-CSRF-TOKEN 标头而拒绝请求的其他服务器出现 API 问题。现在它将完美运行。
2021-03-16 16:39:13
@UmeshAwasthi 你使用 node.js 吗?
2021-03-25 16:39:13
不,我为此使用了 Jquery
2021-03-30 16:39:13
谢谢,虽然值正在传递,但它在请求中不可用,这是在服务器端从请求中获取它的方式 request.getParameter(CSRF_PARAM_NAME)
2021-04-06 16:39:13

这是我在使用 ajax 发送 POST 请求时用来防止 CSRF 令牌问题的代码

$(document).ready(function(){
    function getCookie(c_name) {
        if(document.cookie.length > 0) {
            c_start = document.cookie.indexOf(c_name + "=");
            if(c_start != -1) {
                c_start = c_start + c_name.length + 1;
                c_end = document.cookie.indexOf(";", c_start);
                if(c_end == -1) c_end = document.cookie.length;
                return unescape(document.cookie.substring(c_start,c_end));
            }
        }
        return "";
    }

    $(function () {
        $.ajaxSetup({
            headers: {
                "X-CSRFToken": getCookie("csrftoken")
            }
        });
    });

});

我使用了你的 getCookie 函数。它是有益的。谢谢
2021-03-18 16:39:13

来自 JSP

<form method="post" id="myForm" action="someURL">
    <input name="csrfToken" value="5965f0d244b7d32b334eff840...etc" type="hidden">    
</form>

这是在挣扎了 3 小时后对我有用的最简单的方法,只需像这样从输入隐藏字段中获取令牌,并且在执行 AJAX 请求时只需要在标头中传递此令牌,如下所示:-

来自 jQuery

var token =  $('input[name="csrfToken"]').attr('value'); 

来自普通的 Javascript

var token = document.getElementsByName("csrfToken").value;

最终的 AJAX 请求

$.ajax({
      url: route.url,
      data : JSON.stringify(data),
      method : 'POST',
      headers: {
                    'X-CSRF-Token': token 
               },
      success: function (data) { ...      },
      error: function (data) { ...  }

});

现在您不需要在 web 配置中禁用 crsf 安全性,而且这也不会在控制台上给您 405(Method Not Allowed) 错误。

希望这会帮助人们.. !!

如果你在 node.js 和 lusca 中工作,也试试这个:

$.ajax({
url: "http://test.com",
type:"post"
headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')}
})