Добавление запроса CSRFToken в Ajax
Мне нужно передать CSRFToken
с помощью почтового запроса на основе Ajax, но не уверен, как это можно сделать наилучшим образом.
Использование платформы, которая внутренне проверяет CSRFToken
в запросе (только запрос POST)
Сначала я думал добавить его в заголовок, например
$(function() {
$.ajaxSetup({
headers : {
'CSRFToken' : getCSRFTokenValue()
}
});
});
Что сделает его доступным для каждого запроса Ajax, но он не будет работать для моего случая, так как запрос CSRFToken
по-прежнему приходит как null.
Есть ли способ установить CSRFToken
для всех вызовов Ajax, имеющих дело с POST
type
Edit
Если я сделаю что-то подобное в своем вызове Ajax
data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()},
Все работает нормально.
Моя проблема: я хочу передать значение CSRFToken
в качестве параметра запроса, а не как заголовок запроса
Ответы
Ответ 1
Как насчет этого,
$("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 );
});
Ответ 2
Вы можете использовать это:
var token = "SOME_TOKEN";
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
jqXHR.setRequestHeader('X-CSRF-Token', token);
});
Из документации:
jQuery.ajaxPrefilter([dataTypes], обработчик (параметры, originalOptions, jqXHR))
Описание: обработка пользовательских параметров Ajax или изменение существующих параметров перед отправкой каждого запроса и перед их обработкой в $.ajax().
Читать
Ответ 3
Вот код, который я использовал для предотвращения проблемы маркера CSRF при отправке запроса POST с помощью ajax
$(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")
}
});
});
});
Ответ 4
Если вы работаете в node.js с lusca, попробуйте также:
$.ajax({
url: "http://test.com",
type:"post"
headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')}
})
Ответ 5
Это сработало для меня (используя 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-токен - это элемент, содержащий токен)
Ответ 6
От 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) { ... }
});
Теперь вам не нужно отключать защиту crsf в веб-конфигурации, а также это не приведет к ошибке 405 (метод не разрешен) на консоли.
Надеюсь, это поможет людям.. !!
Ответ 7
Ответ выше не помог мне.
Я добавил следующий код перед моим запросом 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/',
});
Ответ 8
У меня была эта проблема в списке сообщений в блоге, сообщение находится в представлении внутри foreach, тогда трудно выбрать его в javascript, и проблема почтового метода и токена также существует.
Этот код для javascript в конце представления, я генерирую токен в javascript functión внутри представления, а не во внешний js файл, тогда легко использовать php lavarel для его создания с помощью функции csrf_token() и отправить метод "удалить" непосредственно в параметрах.
Вы можете видеть, что я не использую в var route: {{route ('post.destroy', $post- > id}}, потому что я не знаю идентификатор, который я хочу удалить, пока кто-то не щелкнет кнопкой уничтожения, если вы у вас нет этой проблемы, вы можете использовать {{route ('post.destroy', $post- > 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 есть больше форм и данных каждого сообщения, но не является важным в этом примере), вы можете увидеть, что я добавляю класс "delete" к кнопке, и я вызываю класс в 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
Ответ 9
Все, кто использует: var myVar = 'token', вероятно, худшая идея. Я могу напечатать это непосредственно в консоли. Вам необходимо зашифровать на стороне клиента, а затем расшифровать на стороне сервера.