2016-04-25 22 views
6

Rails'de tam sayfa önbelleğe alma işlemi gerçekleştirmeye çalışıyorum ancak CSRF ile ilgili olarak büyük bir hayranlıkla karşılaştım - ya da belki de sadece benim anlayışımı. Şu anda JS'nin üstbilgi etiketlerine erişip yeniden yazabileceği bir çerezde saklanan form_authenticity_token dizesine sahibim.4 özgünlük belirtecini raylar - hem üstbilgide hem de gizli girdi biçiminde?

benim oluşturulan HTML belirteçleri bulan iki yer vardır: Bir formun gizli giriş elemanı İç kafa

<meta name="csrf-token" content="[hash]">

2) ise

1)

<input type="hidden" name="authenticity_token" value="[different hash]">

Belirtildiği gibi, bu karmalar birbirinden farklıdır (önbelleğe alma işleminin mümkün olmadığı geliştirme modunda) ed). Neden farklılar? Neden kafa meta etiketlerini silip form girişini yalnız bırakabilirim ve isteke izin verilir? Yine de form giriş etiketini sildiğimde ve başlıkları bıraktığımda istek reddediliyor mu?

Etkili olarak bu, kafa etiketleri işe yaramaz anlamına geliyor, değil mi? Form giriş etiketini, başlık etiketleriyle yaptığım gibi, çerezimdeki değere yeniden yazabilirim, ancak birbirlerinden farklı olduklarından, özellikle tam sayfa önbellekleme söz konusu olduğunda, sonuçların ne anlama gelebileceğine dair ihtiyatlıyım. .

Uygulama Denetleyici içerir:

protect_from_forgery with: :exception 
before_filter :csrf_cookie 

def csrf_cookie 
    cookies['authenticity-token'.freeze] = { 
    value: form_authenticity_token, 
    expires: 1.day.from_now, 
    secure: (Rails.env.staging? || Rails.env.production?) 
    } 
end 

cevap

2

başka bir sorun led me to the answer üzerine SO dolaşma. Kısaca Rails, CSRF belirtecini ajax isteklerine otomatik olarak ekleyerek jQuery kullanıcılarına yardımcı olur. Meta etiketlerinde görünüyor.

Bu nedenle formda CSRF belirtecine sahip olmak, POST istekleri gönderilirken ve başlığa sahip olmak, ajax istekleri ile zaman/çaba/hata kaydetmek için kullanışlıdır.

Belki de bir form mevcut olmadığında bir ajax isteği yapmak isteyebilirsiniz çünkü o da sahip olmak iyidir. Bir form varsa ve javascript devre dışıysa, başlıkta yer almak POST isteğine dahil edilmeyeceği için herhangi bir istekte bulunmaz.

Neden farklı olduklarına gelince, yalnızca bu algoritma ile üretim sırasında ilgili bir şey olduğunu tahmin edebilirim ... ama burada ne var ne de her iki belirteç de var.

İlgili konular