CSRF ile ilgili tüm sorunu ve bunu önlemek için uygun yolları anlamaya çalışıyorum. (Okuduğum, anladığım ve kabul ettiğim kaynaklar: OWASP CSRF Önleme Hile Sayfası , CSRF hakkında sorular .)
Anladığım kadarıyla, CSRF çevresindeki güvenlik açığı, (web sunucusunun bakış açısından) gelen bir HTTP isteğindeki geçerli bir oturum çerezinin kimliği doğrulanmış bir kullanıcının isteklerini yansıttığı varsayımı ile ortaya çıkar. Ancak, kaynak etki alanı için tüm çerezler tarayıcı tarafından isteğe sihirli bir şekilde eklenir, bu nedenle gerçekten tüm sunucu, bir istekte geçerli bir oturum çerezi varlığından çıkarım yapabilir, isteğin kimliği doğrulanmış bir oturumu olan bir tarayıcıdan gelmesi; kod hakkında başka bir şey üstlenemeztarayıcıda çalıştığını veya kullanıcının isteklerini gerçekten yansıtıp yansıtmadığını gösterir. Bunu önlemenin yolu, tarayıcıya otomatik çerez işleme dışında bazı yollarla taşınan isteğe ek kimlik doğrulama bilgilerini ("CSRF jetonu") dahil etmektir. Daha sonra, oturum çerezi kullanıcının / tarayıcının kimliğini ve CSRF jetonu tarayıcıda çalışan kodu doğrular.
Özetle, web uygulamanızdaki kullanıcıların kimliğini doğrulamak için bir oturum çerezi kullanıyorsanız, her yanıta bir CSRF jetonu eklemeniz ve her (mutasyona uğrayan) istekte eşleşen bir CSRF jetonu eklemeniz gerekir. CSRF jetonu daha sonra sunucudan tarayıcıya sunucuya geri dönüş yapar ve sunucuya istekte bulunan sayfanın o sunucu tarafından onaylandığını (hatta oluşturduğunu) kanıtlar.
Benim sorum, hangi gidiş-dönüş o CSRF jetonu için kullanılan belirli taşıma yöntemi hakkında.
CSRF jetonunu sunucudan istemciye bir çerez olarak (yani bir Set-Cookie başlığında) göndermek ve istemcide Javascript'in çerezden kazıması ve eklemek için yaygın (ör. AngularJS , Django , Rails ) ayrı bir XSRF-TOKEN üstbilgisi olarak sunucuya geri göndermek için.
(Alternatif bir yöntem, örneğin Express tarafından önerilen yöntemdir , burada sunucu tarafından oluşturulan CSRF belirteci, sunucuya geri gönderecek koda / biçimlendirmeye doğrudan eklenmiş olan sunucu tarafı şablon genişletme yoluyla yanıt gövdesine eklenir; Bu örnek, bir şeyler yapmanın daha web 1.0-ish yoludur, ancak daha fazla JS-ağır bir istemciye genelleme yapar.)
Set-Cookie'yi CSRF jetonu için aşağı yönlü taşıma olarak kullanmak neden bu kadar yaygındır / bu neden iyi bir fikirdir? Tüm bu çerçevelerin yazarlarının seçeneklerini dikkatlice düşündüklerini ve bunu yanlış anlamadıklarını düşünüyorum. Ancak ilk bakışta, tanımlama bilgilerini temel olarak tanımlamalardaki tasarım sınırlamasının ne olduğunu bulmak için çerezleri kullanmak oldukça zordur. Aslında, gidiş-dönüş aktarımı olarak çerezleri kullandıysanız (sunucunun tarayıcıya CSRF jetonunu bildirmesi için Set-Cookie: başlık akış aşağısı ve tarayıcının sunucuya döndürmesi için yukarı yönlü Cookie: başlık) düzeltmeye çalışıyorlar.
Yukarıdaki çerçevelerin CSRF jetonu için tüm gidiş-dönüş için çerezleri kullanmadığının farkındayım; akış aşağısında Set-Cookie kullanırlar, daha sonra başka bir şey (örneğin, bir X-CSRF-Token başlığı) kullanırlar ve bu, güvenlik açığını kapatır. Ancak Set-Cookie'yi aşağı akım taşımacılığı olarak kullanmak bile yanıltıcı ve tehlikelidir; tarayıcı artık CSRF jetonunu orijinal kötü amaçlı XSRF istekleri dahil olmak üzere her isteğe ekleyecektir; en iyisi, isteği olması gerekenden daha büyük yapar ve en kötüsü de bazı iyi niyetli ama yanlış yönlendirilmiş bir sunucu kodu parçası gerçekten çok kötü olurdu. Ayrıca, CSRF jetonunun gerçek amaçlanan alıcısı istemci tarafı Javascript olduğundan, bu çerez sadece http ile korunamaz demektir.