Мой Ajax jQuery POST запрашивает работы, не отправляя Маркер Подлинности (направляющие)

Есть ли какие-либо условия в направляющих, которые позволили бы всему Ajax запросы POST от сайта для передачи без authenticity_token?

У меня есть POST JQuery ajax вызов, который называет метод контроллера, но я не помещал кода подлинности в него, и все же вызов успешно выполняется.

Мой ApplicationController действительно имеет 'request_forgery_protection', и я изменился

config.action_controller.consider_all_requests_local

ко лжи в моем environments/development.rb

Я также искал свой код, чтобы гарантировать, что я не перегружал ajaxSend для отсылки маркеров подлинности.

Есть ли некоторый механизм в игре, которая отключает проверку? Теперь я не уверен, работает ли моя защита CSRF или нет.

Я использую направляющие 2.3.5.

Обновление для ясности:

function voteup(url, groupid){
      $.ajax({
        type: "POST",
        url: "/groups/" + groupid + "/submissions/voteup",
        data: "url=" + url,
        dataType: 'text',
        success: function(data){
          var counter = "vote_" + url;
          $('#vote_' + url.cleanify()).text(" " + data + " ");
        }
      });
    };

У меня есть ссылка, которая затем имеет 'href, который вызывает вышеупомянутую функцию:

<a href='javascript:voteup(param1,param2)'>...</a>
5
задан David C 17 June 2010 в 07:07
поделиться

2 ответа

Вероятный сценарий здесь заключается в том, что вы используете jQuery для сериализации нормальной формы Rails ... и это включает в себя скрытое поле сериализованного токена аутентификации (Rails добавляет их во все формы) .

Посмотрите на сгенерированный вами источник формы, которую вы отправляете ... вероятно, вы увидите

<input name="authenticity_token" type="hidden" value="somethinghere...." />

Еще вы можете проверить журнал, чтобы увидеть, есть ли поле Authentity_token в параметрах запроса.

6
ответ дан 14 December 2019 в 01:01
поделиться

Добавьте это в свой макет: app / views / layouts / (something) .html.erb

<% if protect_against_forgery? %>
 <script type="text/javascript" charset="utf-8">
  //<![CDATA[
   window._auth_token_name = "#{request_forgery_protection_token}";
   window._auth_token = "#{form_authenticity_token}";
  //]]>
 </script>
<% end %>

И в вашем application.js:

$.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});

$(document).ready(function() {
 //  All non-GET requests will add the authenticity token
 //  If not already present in the data packet
 $("body").bind('ajaxSend', function(elm, xhr, s) {
   if (s.type == "GET") return;
   if (s.data && s.data.match(new RegExp("\\b" + window._auth_token_name + "="))) return;
   if (s.data) {
  s.data = s.data + "&";
  } else {
   s.data = "";
   // if there was no data, $ didn't set the content-type
   xhr.setRequestHeader("Content-Type", s.contentType);
  }
  s.data = s.data + encodeURIComponent(window._auth_token_name) + "=" + encodeURIComponent(window._auth_token);
 });

Добавьте это в свой application_controller.rb, чтобы убедиться, что IE / SAFARI получает правильные заголовки принятия:

 def correct_safari_and_ie_accept_headers
    ajax_request_types = [ 'text/javascript', 'application/json', 'text/xml']
        request.accepts.sort!{ |x, y| ajax_request_types.include?(y.to_s) ? 1 : -1 } if request.xhr?
 end

Это гарантирует, что заголовок принятия по умолчанию равен text / javascript , application / json или text / xml вместо значения по умолчанию текст / HTML .

Теперь вы можете выполнять обычные вызовы AJAX. Он передаст токен авторизации. Также убедитесь, что вы включили application.js только после тега сценария CDATA, поскольку для этого требуются две глобальные переменные window._auth_token_name и window._auth_token .

Надеюсь, это поможет! Ура :)

3
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: