2011-05-22 13 views
5

Varsayılan olarak application_controller.rb dosyasında protect_from_forgery olan Rails 3.0.2 kullanıyorum.Raylar 3 protect_from_forgery doğru çalışmıyor mu?

InvalidAuthenticityToken'u tetiklemek istedim.
Sayfamı bu javascript eklemiş Bunun için:

$('input[name=authenticity_token]').val('aaa') 

Firebug ile DOM kontrol etme ben authenticity_token gizli alan doğru güncellenir görüyoruz.

Formu gönderir ve günlüğü sunucudan kontrol edersem göreceli parametrenin doğru şekilde 'aaa' olarak ayarlandığını görürsünüz. İstek doğru olduğunda işlenirken bir InvalidAuthenticityToken almayı beklerdim!

Bu nasıl olabilir?

+1

pb'nizi çözdüğü için cevabı kabul etmelisiniz. – apneadiving

+0

sıfırlama oturumu CSRF'ye karşı korumak için yeterli değildir. raylar 4'te, varsayılan karşı önlem, daha güvenli olan bir istisnadır. –

cevap

12

Özgünlük belirteci/csrf davranışının belgeleri güncel değil. Bu durumlarda artık InvalidAuthenticityToken istisnası atılmıyor, bunun yerine oturumunuz sıfırlanıyor. Bunu farklı bir şekilde (veya eski yolla) işlemek isterseniz, kendi davranışınızı denetleyicinizde handle_unverified_request olarak tanımlayabilirsiniz.

+0

Çok teşekkürler! Ben yaptım ve mükemmel çalışıyor! – Diego

1

Ayrıca, formunuzun içinde bulunduğu html sayfasının meta etiketinde bulunan Orijinallik belirtecini sıfırlamanız gerektiğine de inanıyorum (orada <% = csrf_meta_tag%> olduğunu varsayarak). Rails, formdaki simgeden (yukarıdaki javascript'inizde değiştirdiğinizden) veya html sayfasının meta etiketindeki simgenin Rails'in beklenen özgünlük belirteciyle eşleşip eşleşmediğini kontrol eder ve bunlardan herhangi biri eşleşirse InvalidAuthenticityToken kazanır ' t tetiklenir ....