Ön kontrol taleplerini getirmenin arkasındaki motivasyon neydi?
Ön kontrol istekleri, tarayıcının belirli istekleri göndermeden önce CORS uyumlu bir sunucuyla uğraştığından emin olabilmesi için tanıtıldı. Bu talepler, hem potansiyel olarak tehlikeli (durum değiştiren) hem de yeni ( Aynı Köken Politikası nedeniyle CORS'den önce mümkün olmayan ) olarak tanımlandı. Ön kontrol isteklerinin kullanılması, sunucuların CORS tarafından mümkün kılınabilecek yeni, potansiyel olarak tehlikeli istek türlerine kaydolmasını (ön kontrole düzgün yanıt vererek) anlamına gelir.
Spesifikasyonun bu bölümünün anlamı şudur: "Kaynakları, bu spesifikasyon mevcut olmadan belirli kullanıcı aracılarından kaynaklanamayan çapraz kökenli taleplere karşı korumak için, kaynağın bu spesifikasyonun farkında olmasını sağlamak için bir ön kontrol talebi yapılır."
Bana bir örnek verebilirmisin?
Bir tarayıcı kullanıcısının bankacılık sitesinde oturum açtığını düşünelim A.com
. Kötü amaçlı yazılımlara gittiklerinde B.com
, bu sayfada DELETE
istek göndermeye çalışan bazı Javascriptler bulunur A.com/account
. Kullanıcı oturum açtığından A.com
, bu istek gönderilirse kullanıcıyı tanımlayan çerezleri içerir.
CORS'den önce, tarayıcının Aynı Köken Politikası bu talebin gönderilmesini engellemiş olurdu. Ancak CORS'un amacı sadece bu tür çapraz kökenli iletişimi mümkün kılmak olduğundan, bu artık uygun değildir.
Tarayıcı olabilir basitçe göndermek DELETE
ve sunucu bunu nasıl işleneceğine karar verelim. Peki ya A.com
CORS protokolünün farkında değilse? Devam edebilir ve tehlikeli olanı idam edebilir DELETE
. Tarayıcının Aynı Köken Politikası nedeniyle asla böyle bir talep alamayabileceğini ve dolayısıyla böyle bir saldırıya karşı hiç sertleştirilmemiş olabileceğini varsaymış olabilir.
Bu tür CORS farkında olmayan sunucuları korumak için, protokol tarayıcının önce bir ön kontrol isteği göndermesini gerektirir . Bu yeni istek, tarayıcının aslını göndermenin güvenli olup olmadığını bilmesini sağlayan, yalnızca CORS bilinçli sunucuların düzgün yanıt verebileceği bir şeydir DELETE
.
Neden tarayıcı ile ilgili tüm bu karışıklık, saldırgan sadece DELETE
kendi bilgisayarından bir istek gönderemez ?
Elbette, ancak böyle bir istek kullanıcının çerezlerini içermez. Bunun önlenmesi için tasarlanan saldırı, tarayıcının isteğin yanı sıra diğer etki alanı için çerezler (özellikle kullanıcı için kimlik doğrulama bilgileri) göndermesine bağlıdır.
Yediğim sesler xsrf sitesi bir form, B.com
kutu POST
için A.com
ve kullanıcının kurabiye zarar verir.
Doğru. Bunu ifade etmenin bir başka yolu, ön kontrol isteklerinin CORS farkında olmayan sunucular için CSRF saldırı yüzeyini artırmayacak şekilde oluşturulmuş olmasıdır.
Ancak ön kontrol gerektirmeyen "basit" isteklerin gereksinimlerine baktığımda, buna POST
hala izin verildiğini görüyorum . Bu durum gibi değişebilir ve verileri silebilir DELETE
!
Bu doğru! CORS sitenizi CSRF saldırılarına karşı korumaz. Sonra tekrar, CORS olmadan CSRF saldırılarına karşı da korunmazsınız. Ön kontrol taleplerinin amacı, CSRF maruziyetinizi CORS öncesi dünyada var olanlarla sınırlamaktır.
İç çekmek. Tamam, isteksizce ön kontrol taleplerini kabul ediyorum. Ancak bunu sunucudaki her kaynak (URL) için neden yapmalıyız? Sunucu ya CORS işlemektedir ya da işlemez.
Bundan emin misin? Birden fazla sunucunun tek bir etki alanı için istekleri işlemesi nadir değildir. Örneğin, isteklerin A.com/url1
bir tür sunucu A.com/url2
tarafından işlenmesi ve isteklerin farklı bir tür sunucu tarafından işlenmesi söz konusu olabilir. Genellikle tek bir kaynağı işleyen sunucunun söz konusu etki alanındaki tüm kaynaklar için güvenlik garantisi sağlayabilmesi söz konusu değildir.
İnce. Uzlaşalım. Sunucunun tam olarak hangi kaynaklarla konuşabileceğini belirtmesine izin veren yeni bir CORS başlığı oluşturalım, böylece bu URL'lere ek ön kontrol isteklerinden kaçınılabilir.
İyi bir fikir! Aslında, başlık Access-Control-Policy-Path
sadece bu amaç için önerildi. Nihayetinde, görünüşe göre , bazı sunucular URI spesifikasyonunu, tarayıcıya güvenli görünen yollara taleplerin aslında kırık sunucularda güvenli olmayacağı şekilde yanlış uyguladığı için , spesifikasyonun dışında bırakıldı .
Bu, performans üzerindeki güvenliği önceliklendiren ve tarayıcıların mevcut sunucuları riske atmadan CORS spesifikasyonunu hemen uygulamasına izin veren ihtiyatlı bir karar mıydı? Yoksa sadece belirli bir sunucudaki hataları barındırmak için bant genişliğini boşa harcamak ve gecikmeyi iki katına çıkarmak için inandırıcı değil miydi?
Görüşler farklı.
Peki, tarayıcılar en azından ön kontrolleri tek bir URL için önbelleğe alacak mı?
Evet. Muhtemelen çok uzun sürmese de. WebKit tarayıcılarında maksimum ön kontrol önbellek süresi şu anda 10 dakikadır .
İç çekmek. Sunucularımın CORS uyumlu olduğunu ve bu nedenle ön kontrol isteklerinin sunduğu korumaya ihtiyaç duymadığını biliyorsam, bunlardan kaçınmamın bir yolu var mı?
Tek gerçek seçeneğiniz, "basit" isteklerin gereksinimlerini karşıladığınızdan emin olmaktır . Bu, başka türlü ekleyebileceğiniz (beğenebileceğiniz X-Requested-With
), hakkında yalan söyleme Content-Type
veya daha fazlası gibi özel başlıkları dışarıda bırakmak anlamına gelebilir .
Ne yaparsanız yapın, CORS belirtimi güvensiz de dahil olmak üzere "basit" istekleri reddetmeyi ele almadığından, uygun CSRF korumasına sahip olduğunuzdan emin olmalısınız POST
. Spesifikasyonda belirtildiği gibi : "basit taleplerin geri çağrılmanın dışında önemi olan kaynaklar kendilerini Siteler Arası İstek Sahteciliğinden korumalıdır".