Мои запросы JQery AJAX POST работают без отправки токена аутентификации (Rails) - PullRequest
5 голосов
/ 17 июня 2010

Есть ли в рельсах положения, которые позволили бы всем запросам AJAX POST с сайта проходить без authenticity_token?

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

Мой ApplicationController имеет 'request_forgery_protection', и я изменил

config.action_controller.consider_all_requests_local

на false в моей среде / development.rb

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

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

Я использую Rails 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>

Ответы [ 3 ]

6 голосов
/ 17 июня 2010

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

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

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

Другая вещь, которую вы можете сделать, это проверить журнал, чтобы увидеть, находится ли поле authenticity_token в параметрах запроса.

3 голосов
/ 17 июня 2010

Добавьте это в свой макет: 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 вместо значения по умолчанию text/html.

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

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

0 голосов
/ 09 ноября 2010

У меня похожий вопрос, и я считаю, что нашел частичный ответ:

Маркер аутентификации AJAX-запроса Rails 3 игнорируется

...