我需要使用基于Ajax的帖子请求传递CSRFToken
,但不确定如何以最佳方式完成此操作。
使用内部检查请求中的CSRFToken
的平台(仅限POST请求)
最初我想把它添加到标题中,如
$(function() {
$.ajaxSetup({
headers : {
'CSRFToken' : getCSRFTokenValue()
}
});
});
这将使每个Ajax请求都可用,但它对我的情况不起作用,因为在请求中CSRFToken
仍然是空的。
我是否可以为处理CSRFToken
类型的所有Ajax调用设置POST
修改 如果我在Ajax调用中做了类似的事情
data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()},
一切都很好。
我的问题是,我想将CSRFToken
值作为请求参数传递而不是作为请求标头
答案 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()处理它们之前。
答案 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'的人,可能是最糟糕的主意。我可以在控制台中直接打印它。您需要在客户端进行加密,然后在服务器端进行解密。