Türkiye'nin bankacılık ve kamu sektöründe yaygın olan ASP.NET Core'da CORS, UseCors middleware'i ile açıkça yapılandırılır. Sık görülen bir hata, geliştirme sırasında .AllowAnyOrigin() ile başlayıp bunu production'a taşımaktır — bu, basit GET istekleri için sorunsuz çalışır, ama .AllowCredentials() eklenip kimlik doğrulama çerezleri farklı bir alt alan adındaki API'ye gönderilmeye başlandığı anda tarayıcı yanıtı reddetmeye başlar; çünkü ASP.NET Core, AllowAnyOrigin ile AllowCredentials'ın aynı politika içinde birlikte kullanılmasına zaten izin vermez.
Aynı köken politikası
Varsayılan olarak, tarayıcılar Same-Origin Policy'yi uygular: bir kökene (alan adı + şema + port) ait bir sayfadaki JavaScript kodu, farklı bir kökene yapılan isteklerin yanıtlarını okuyamaz. Bu, bir sitedeki kötü amaçlı bir betiğin, kullanıcının oturum açtığı başka bir siteden veri çalmasını engelleyen temel bir güvenlik mekanizmasıdır.
CORS bu politikayı nasıl gevşetir
CORS (Cross-Origin Resource Sharing), bir sunucunun belirli (veya tüm) dış kökenlere yanıtlarını okuma izni açıkça verdiği bir dizi HTTP başlığıdır. Anahtar başlık, hangi alan adlarının izinli olduğunu belirten Access-Control-Allow-Origin'dir.
Wildcard artı credentials tuzağı
Farklı bir alt alan adındaki API'ye oturum çerezi göndermek için gerekli olan credentials: 'include' ile bir istek gönderildiğinde, tarayıcı yanıtta Access-Control-Allow-Origin: * değerini kesinlikle kabul etmez. Spesifikasyon, joker karakterli bir kökeni credentials ile birleştirmeyi açıkça yasaklar; sunucunun bunun yerine isteği gönderen tam kökeni geri döndürmesi gerekir.
Bu neden gereklidir
- Bir CORS hatasını teşhis etmek ve sunucuda tam olarak hangi başlıkların eksik olduğunu anlamak.
- ASP.NET Core'da geliştirme aşamasından kalan aşırı izin verici
AllowAnyOriginpolitikasını production'a çıkmadan yakalamak. - "Basit" istekler ile preflight (OPTIONS) istekleri arasındaki farkı anlamak.
CORS sunucuyu saldırılardan korumaz
CORS'un sunucu tarafında bir güvenlik önlemi olduğunu düşünmek yaygın bir yanılgıdır — gerçekte yalnızca tarayıcıdaki JavaScript'in ne okuyabileceğini kısıtlar. curl, Postman veya bir backend betiği doğrudan kullanan bir saldırgan, bu araçlar Same-Origin Policy'yi uygulamadığı için CORS'u tamamen atlar. CORS, sunucudaki gerçek kimlik doğrulama ve yetkilendirmenin yerini asla tutmamalıdır.