Öncelikle CORS web tarayıcılarında geçerli bir sınırlamadır. C# veya herhangi bir programlama dilini kullanarak herhangi bir kaynağa request gönderildiği zaman CORS ile karşılaşılmaz. Web’de oluşabilecek güvenlik açığına yönelik tarayıcıların kullanıcılarını korumak için uygulamaya başladığı politikadır. Aynı origin aynı origin’e erişebilir. X sitesi üzerinden Y sitesine bir request gönderilmeye çalışıldığında CORS karşımıza çıkacaktır. Single Page Application ile bir uygulama geliştirirken de karşımıza çıkar. SPA origin’i farklıdır. Server origin’i farklıdır.
Peki nedir bu origin?
“https://onuratasoy.net/” bir origindir. Devamındaki kaynak önemsizdir. Bu origin 3 yapıdan oluşuyor.
- Protokol: https
- Host: onuratasoy.net
- Port numarası: Default olarak 80'dir.
Erişmek istediğimiz kaynaklar bu origin üzerindeyse CORS origin için tetiklenmez. Explorer tarayıcısı hariç diğer tarayıcılar alt domainleri farklı bir origin olarak algılar.
Bir request sürecini düşünürsek aşağıdaki http özelliklerini kullanırız.
- İstek yapacağımız endpoint'i belirtiyoruz.
- Http metot tipini belirtiriz. Get, Post, Put, Patch, Options, Head...
- Header kısmı yer alır. Origin bilgisi tarayıcı tarafından otomatik eklenir ve javascript ile değiştirilemez.
- Cookie
Tüm olay bunlar etrafında gelişiyor. Buradaki istekler sonucunda tarayıcı sunucudan gelen response içerisindeki header’da belirli değerlere bakar. Eğer o değerler yoksa veya eşleşmiyorsa erişim reddedilir.
Tarayıcı header kısmında hangi değerlere ihtiyaç duyuyor?
- Access-Control-Allow-Origin
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
- Access-Control-Allow-Credentials
Header kısımlarından da hangi request’ler sonucunda bu header değerlerine ihtiyaç duyulduğu az çok belli. Önce origin değerine bakar. * veya onuratasoy.net ise erişime izin verir. Metot kısmında get varsa get isteğine izin verir. Header kısmında “customkey” varsa o değerlere izin verir. Bunların hepsi aynı anda olmak zorunda değil. Yapılan request’e göre şekilleniyor. Tarayıcı ihtiyacı olanlara bakar. Origin önemliyse origin’e bakar. Credentials olup olmamasına bakmaz.
Preflight nedir?
Request belirli şartların hepsini karşılamıyorsa tarayıcı gönderilecek olan request’den önce option verb’i ile bir request gerçekleştirir. Gelen response’un header kısmındaki değerlere göre gönderilecek olan request için uygun olup olmadığını kontrol eder. Eğer uymuyorsa o isteği göndermez. Tarayıcı şartlarına uyuyorsa gelen response, tarayıcı beklettiği request’i gönderir. 2 kez request işlemi gerçekleşmiş oluyor.
Ne zaman preflight tetiklenmez?
Bir request bazı şartların hepsini karşıladığı zaman preflight devreye girmez.
- Get, Head ve Post fiilleriyle bir http isteği olmalıdır.
- Header kısmında varsayılan değerler dışında bir değer olmamalıdır. Accept, Accept-Language, Content-Language, Content-Type, Range.
- Content-Type'ın değerinin "application/x-www-form-urlencoded", "multipart/form-data" veya "text/plain" olması gerekir.
- XMLHttpRequest üzerinden herhangi bir event gerçekleşmemesi gerekiyor.
Bu CORS aşıldığı anlamına gelmiyor. CORS yine geçerli fakat option request’i atılmamış oluyor. Sadece 1 request gönderiliyor.
CORS politikasını aşan durumlarda request kısmına bu değerler eklenir. Access-Control-Request-Headers: “x”, Access-Control-Request-Method:”Put” gibi. Sunucuya nasıl bir ihlal olduğu gönderiliyor.
.Net'de CORS nasıl ayarlanır?
Program.cs kısmına gidip önce “AddCors” servisini ekleyeceğiz ardından middleware olarak çağırıp request pipeline’ına dahil edilmesini sağlayacağız.
builder.Services.AddCors(opt =>
{
opt.AddDefaultPolicy(policy =>{
policy.WithOrigins("https://onuratasoy.net", "x”,”y”)AllowAnyHeader().AllowAnyMethod().AllowCredentials();
});
});
veya
builder.Services.AddCors(options =>
{
options.AddPolicy(name:”policy name”,
policy =>
{
policy.WithOrigins("http://www.onuratasoy.net");
});
});
Bu tanımlama ile farklı kaynaklara farklı kurallar tanımlayabiliriz.
[EnableCors("policy name")] ile tetikleyebiliyoruz.
Default tanımlama tüm endpointlerde geçerli. Default tanımlamanın dışına çıkmak istersek policy olarak tanımlayabiliriz.
[DisableCors] attribute’u ile CORS devre dışı bırakılabilir.
policy =>
{
policy.WithOrigins("http://example.com")
.WithHeaders(HeaderNames.ContentType, "x-custom-header");
});
şeklinde sunucunun nelere izin vereceğini belirtiyoruz.
Bunun dışında metot olarak da ilerleyebiliyoruz. İlgili endpoint için options ile bir metot tanımlayabiliriz. Ayrıca Credentials cookie dahil edilmişse tetiklenir.
Yorumlar
0 yorum