将CSRFToken添加到Ajax请求中

时间:2014-02-27 09:00:45

标签: javascript jquery ajax

我需要使用基于Ajax的帖子请求传递CSRFToken,但不确定如何以最佳方式完成此操作。 使用内部检查请求中的CSRFToken的平台(仅限POST请求)

最初我想把它添加到标题中,如

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

这将使每个Ajax请求都可用,但它对我的情况不起作用,因为在请求中CSRFToken仍然是空的。

我是否可以为处理CSRFToken类型的所有Ajax调用设置POST

修改 如果我在Ajax调用中做了类似的事情

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

一切都很好。

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

9 个答案:

答案 0 :(得分:26)

这个怎么样,

$("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 );
        });

答案 1 :(得分:7)

您可以使用:

var token = "SOME_TOKEN";

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

来自文档:

  

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

     

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

Read

答案 2 :(得分:4)

以下是用于在使用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")
            }
        });
    });

});

答案 3 :(得分:2)

如果您正在使用lusca在node.js中工作,请尝试:

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

答案 4 :(得分:1)

这对我有用(使用jQuery 2.1)

$(document).ajaxSend(function(elm, xhr, s){
    if (s.type == "POST") {
        s.data += s.data?"&":"";
        s.data += "_token=" + $('#csrf-token').val();
    }
});

或者这个:

$(document).ajaxSend(function(elm, xhr, s){
    if (s.type == "POST") {
        xhr.setRequestHeader('x-csrf-token', $('#csrf-token').val());
    }
});

(其中#csrf-token是包含令牌的元素)

答案 5 :(得分:1)

来自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(不允许使用方法)错误。

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

答案 6 :(得分:0)

上面的答案对我不起作用。

我在我的ajax请求之前添加了以下代码:

function getCookie(name) {
                var cookieValue = null;
                if (document.cookie && document.cookie != '') {
                    var cookies = document.cookie.split(';');
                    for (var i = 0; i < cookies.length; i++) {
                        var cookie = jQuery.trim(cookies[i]);
                        // Does this cookie string begin with the name we want?
                        if (cookie.substring(0, name.length + 1) == (name + '=')) {
                            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                            break;
                        }
                    }
                }
                return cookieValue;
            }
            var csrftoken = getCookie('csrftoken');

            function csrfSafeMethod(method) {
                // these HTTP methods do not require CSRF protection
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }

            $.ajaxSetup({
                beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });

            $.ajax({
                     type: 'POST',
                     url: '/url/',
            });

答案 7 :(得分:0)

我在博客中的帖子列表中遇到此问题,帖子在foreach中的视图中,然后很难在javascript中选择它,并且post方法和令牌的问题也存在。

这是javascript在视图末尾的代码,我在视图内部的javascript函数中生成令牌而不是在外部js文件中,然后很容易使用php lavarel用csrf_token()函数生成它,并发送params中的“删除”方法。 你可以看到我没有在var route中使用:{{route('post.destroy',$ post-&gt; id}}因为我不知道我要删除的id,直到有人点击destroy按钮,如果你没有这个问题,你可以使用{{route('post.destroy',$ post-&gt; id}}或其他类似的东西。

  $(function(){
    $(".destroy").on("click", function(){
         var vid = $(this).attr("id");
         var v_token = "{{csrf_token()}}";
         var params = {_method: 'DELETE', _token: v_token};
         var route = "http://imagica.app/posts/" + vid + "";
    $.ajax({
         type: "POST",
         url: route,
         data: params
    });
   });
  });

这是视图中的内容代码(在foreach里面有更多的表单和每个帖子的数据,但是这个例子并不重要),你可以看到我在按钮中添加了一个“删除”类,我调用了类的JavaScript。

      @foreach($posts as $post)
          <form method="POST">
            <button id="{{$post->id}}" class="btn btn-danger btn-sm pull-right destroy" type="button" >eliminar</button>
          </form>
      @endforeach

答案 8 :(得分:0)

每个使用var myVar ='token'的人,可能是最糟糕的主意。我可以在控制台中直接打印它。您需要在客户端进行加密,然后在服务器端进行解密。