- Konu sahibi
- #1
CORS denetimi, bir API’nin hangi web origin’lerine yanıt okuma izni verdiğini ve bu politikanın olumlu ve olumsuz durumlarda tutarlı çalıştığını sınamaktır. Yalnız başarılı bir istek görmek yeterli değildir: izin verilmeyen bir origin’in yanıtı okuyamadığını, preflight gerektiren yöntem ve başlıkların doğru değerlendirildiğini de kontrol etmelisiniz. Bu rehber bir hata mesajını gidermekten çok, yapılandırılmış politikanın testine odaklanır.
Denetimi kendi API’nizde veya yetkili test ortamında, veri değiştirmeyen bir uç noktayla yapın. Örnekte
Origin karşılaştırmasında şema, ana makine ve port birlikte önemlidir. API adresi ile izin verilen arayüz adresi farklı kavramlardır; izin listesine API’nin kendi adresini yazmak arayüze otomatik izin vermez.
cURL kurulu bir kabukta şu iki isteğin yanıt başlıklarını karşılaştırın:
İlk yanıtta beklenen izin,
cURL, tarayıcının CORS engelini uygulamaz. Bu nedenle komutun veri göstermesini “olumsuz test başarısız” şeklinde yorumlamayın. Sonucu, izin başlıklarını ve daha sonra gerçek tarayıcı davranışını birlikte değerlendirerek kaydedin.
Uygulama Authorization gibi bir başlık kullanıyorsa tarayıcı ön kontrol isteği yapar. Temsili bir kontrol:
Bu komut asıl GET işlemini yapmaz; sunucuya hangi yöntemin ve başlığın kullanılacağını bildirir. Beklenen sonuç başarılı bir HTTP durumu, doğru origin ve Authorization başlığına uygun izindir. Authorization iznini genel bir yıldızın kapsadığını varsaymayın; bu başlığın açıkça listelenmesi gerekir. Sadece OPTIONS yanıtının doğru olması da yetmez; gerçek GET yanıtını ayrıca inceleyin.
Olumsuz preflight testini, uygulamanın desteklemediği bir yöntem veya başlık adıyla yalnız OPTIONS isteğinde yapın. Asıl veri değiştiren isteği göndererek test etmeyin.
Hayır. CORS tarayıcıdaki yanıt erişimini düzenler; kullanıcının kaynağı okumaya veya değiştirmeye yetkili olup olmadığı sunucuda ayrıca denetlenmelidir. CORS sonucu, genel erişim kontrolü testi yerine kullanılamaz.
Preflight yanıtları ayrı bir önbellekte tutulabilir. Testi yorumlarken Access-Control-Max-Age değerini ve tarayıcının mevcut ön kontrol kaydını dikkate alın; yalnız normal sayfa önbelleğini yenilemenin tüm ön kontrol sonuçlarını kaldırdığını varsaymayın.
Önce beklenen politikayı yazın
Denetimi kendi API’nizde veya yetkili test ortamında, veri değiştirmeyen bir uç noktayla yapın. Örnekte
https://api.example.com/data adresinin GET yanıtını yalnız https://app.example.com okuyabilsin. https://deny.example.net ise izinli olmasın. Gerçek uygulamada endpoint, origin ve kullanılacak başlık listesini kendi sözleşmenize göre değiştirin.Origin karşılaştırmasında şema, ana makine ve port birlikte önemlidir. API adresi ile izin verilen arayüz adresi farklı kavramlardır; izin listesine API’nin kendi adresini yazmak arayüze otomatik izin vermez.
Olumlu ve olumsuz origin testi
cURL kurulu bir kabukta şu iki isteğin yanıt başlıklarını karşılaştırın:
Bash:
curl --include "https://api.example.com/data" -H "Origin: https://app.example.com"
curl --include "https://api.example.com/data" -H "Origin: https://deny.example.net"
İlk yanıtta beklenen izin,
Access-Control-Allow-Origin: https://app.example.com değeridir. İkinci yanıtta reddedilen origin’i izinli gösteren bir başlık bulunmamalıdır. Sunucu yine 200 ve veri döndürebilir; CORS denetiminin ölçtüğü şey tarayıcıdaki JavaScript’in bu yanıtı okuyabilmesidir.cURL, tarayıcının CORS engelini uygulamaz. Bu nedenle komutun veri göstermesini “olumsuz test başarısız” şeklinde yorumlamayın. Sonucu, izin başlıklarını ve daha sonra gerçek tarayıcı davranışını birlikte değerlendirerek kaydedin.
Preflight denetimi
Uygulama Authorization gibi bir başlık kullanıyorsa tarayıcı ön kontrol isteği yapar. Temsili bir kontrol:
Bash:
curl --include -X OPTIONS "https://api.example.com/data" -H "Origin: https://app.example.com" -H "Access-Control-Request-Method: GET" -H "Access-Control-Request-Headers: Authorization"
Bu komut asıl GET işlemini yapmaz; sunucuya hangi yöntemin ve başlığın kullanılacağını bildirir. Beklenen sonuç başarılı bir HTTP durumu, doğru origin ve Authorization başlığına uygun izindir. Authorization iznini genel bir yıldızın kapsadığını varsaymayın; bu başlığın açıkça listelenmesi gerekir. Sadece OPTIONS yanıtının doğru olması da yetmez; gerçek GET yanıtını ayrıca inceleyin.
| Test | Beklenen sonuç | Kaydedilecek kanıt |
|---|---|---|
| İzinli origin | Yanıt tarayıcı koduna açılır | Gerçek istek origin’i ve Allow-Origin |
| İzinsiz origin | Yanıt tarayıcı koduna açılmaz | İzin veren başlığın bulunmaması veya eşleşmemesi |
| İzinli preflight | Yöntem/başlık kontrolü geçer | OPTIONS durumu ve izin başlıkları |
| İzinsiz yöntem veya başlık | Ön kontrol tarayıcıda reddedilir | İstenen değer ile yanıt farkı |
Olumsuz preflight testini, uygulamanın desteklemediği bir yöntem veya başlık adıyla yalnız OPTIONS isteğinde yapın. Asıl veri değiştiren isteği göndererek test etmeyin.
Tarayıcı ve önbellek kontrolü
- Gerçek arayüzün test sayfasından API’ye istek yapın; Network’te gönderilen Origin ile izin başlığını karşılaştırın.
- İzinsiz bir test origin’inden aynı isteği sınayın. JavaScript’in yanıtı okuyamadığını doğrulayın.
- Çerezli kullanımda istemcinin credentials modu ile belirli Allow-Origin ve
Access-Control-Allow-Credentials: truedeğerini birlikte kontrol edin; yıldız origin bu modla uyumlu değildir. - Yanıtın Allow-Origin değeri istek origin’ine göre değişiyorsa HTTP önbelleğinde
Vary: Originkullanımını inceleyin. - Sonucu endpoint, yöntem, origin, istenen başlıklar ve kimlik bilgisi modu ile kaydedin; parolayı veya gerçek erişim belirtecini rapora eklemeyin.
Sık sorulan sorular
CORS denetimi API’nin yetkilendirmesini de kanıtlar mı?
Hayır. CORS tarayıcıdaki yanıt erişimini düzenler; kullanıcının kaynağı okumaya veya değiştirmeye yetkili olup olmadığı sunucuda ayrıca denetlenmelidir. CORS sonucu, genel erişim kontrolü testi yerine kullanılamaz.
Başlıklar düzeldi ama tarayıcı eski preflight sonucunu kullanıyorsa?
Preflight yanıtları ayrı bir önbellekte tutulabilir. Testi yorumlarken Access-Control-Max-Age değerini ve tarayıcının mevcut ön kontrol kaydını dikkate alın; yalnız normal sayfa önbelleğini yenilemenin tüm ön kontrol sonuçlarını kaldırdığını varsaymayın.