2010-06-17 13 views
5

Tüm AJAX POST isteklerinin siteden bir authenticity_token olmadan geçmesine izin verecek raylarda herhangi bir düzenleme var mı?My jquery AJAX POST istekleri bir Authenticity Token (Rails) göndermeden çalışır

Bir denetleyici yöntemini çağıran bir JQuery POST ajax çağrısı alıyorum, ancak herhangi bir özgünlük kodu koydum ve çağrı başarılı.

Ben de aşırı değildi sağlamak için kodumu aradık/development.rb

Benim ApplicationController 'request_forgery_protection' var ve benim ortamlarda false

config.action_controller.consider_all_requests_local 

değiştirdik ajaxStatiklik belirteçleri gönderir.

Çekmeyi devre dışı bırakan bazı mekanizmalar var mı? Şimdi, CSRF korumamın çalışıp çalışmadığından emin değilim.

Rails 2.3.5 kullanıyorum. netlik için

Güncelleme:

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 + " "); 
     } 
     }); 
    }; 

Sonra yukarıdaki işlevini çağıran bir 'href sahip bir bağlantı vardır:

<a href='javascript:voteup(param1,param2)'>...</a> 
+0

Ben benzer bir soruya cevap hatırladı burada buldum: http://stackoverflow.com/sorular/2725118/raylar-istek-sahtecilik-koruma-ayarları/2725991 Sanırım yerel bir istek onun olması gerekir. Farklı bir bağlantı noktasında veya farklı bir alanda çalışan bir uygulamadan çalışmaz. Örn: Eğer uygulamanızı localhost: 3000 üzerinde çalıştırıyorsanız, localhost'tan ajax POST yapamazsınız: 3001. –

+0

Merhaba Shripad, Gönderinizi gördüm, ama bu nasıl oluyor? Bir çeşit Rails büyüsü var mı? Online görünüyor, hala form_authenticity_token göndermek için yönergeleri yazan insanlar görüyorum, bu nedenle, sabit, neden hala bunu yapmaya gerek var? –

+0

Bunun, Rails büyüsüyle hiçbir ilgisi yoktur. Ajax, etki alanının kendisinde çağrılırsa bir kimlik doğrulama belirteci olmadan çalışır. Ajax'ın etki alanınızda çalışması için değil, diğer etki alanlarından gelen saldırıları engellemek için bir kimlik doğrulama belirtecine ihtiyacınız vardır. Uygulama denetleyicinizde "protect_from_forgery" işlevinin olması için birincil neden budur. Başka bir alandan saldırıya en iyi örnek "Myspace sammy solucanı" dır. Baksana. O zaman neden bir auth jetonuna ihtiyacınız olduğunu anlayacaksınız. –

cevap

6

burada bir olası senaryo kullandığınız olmasıdır jQuery, normal Rails formunu serileştirir ... ve seri hale getirilmiş auth jetonu gizli alanına (Rails bunları tüm formlara ekler) dahil eder. gönderimde formu için lütfen oluşturulan kaynakta

Bak ... Eğer yapabileceğiniz diğer bir şey authenticity_token alan olup olmadığını görmek için günlüğünü kontrol etmektir

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

göreceksiniz muhtemelen istek param.

+1

Soruyu bazı kod örnekleri ile güncelledim. Günlüklerim bir authenticity_token parametresi gönderilmiyor. –

3

senin düzeni görünümünde ekleyin: 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 %> 

Ve 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); 
}); 

sizin application_controller.rb bu eklemek IE/SAFARİ doğru kabul almasını sağlamak için üstbilgiler:

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 

Bu, kabul edilen başlığın varsayılan olarak text/html yerine text/javascript, application/json veya text/xml olmasını sağlar.

Şimdi düzenli AJAX çağrılarınızı gerçekleştirebilirsiniz. Auth jetonunu geçecek. Ayrıca, uygulama.js'yi yalnızca iki global var window._auth_token_name ve window._auth_token gerektirdiğinden CDATA komut dosyası etiketinden sonra eklediğinizden emin olun.

Bu yardımcı olur umarız!Şerefe :)

+0

kod için teşekkürler, ama benim sorunum bu noktada, gönderilerim auth jetonu olmadan bile çalışıyor. –

İlgili konular