Подтвердить что ты не робот

Добавление запроса 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 в качестве параметра запроса, а не как заголовок запроса

4b9b3361

Ответ 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', вероятно, худшая идея. Я могу напечатать это непосредственно в консоли. Вам необходимо зашифровать на стороне клиента, а затем расшифровать на стороне сервера.