Access-Control-Allow-Credentials başlığı tam olarak ne yapar?


167

CORS'i nasıl kullanacağımı anlamaya çalışıyorum ve Access-Control-Allow-Credentialsbaşlığın ne yaptığı konusunda kafam karıştı .

Belgeler diyor

Kimlik bilgileri bayrağı doğru olduğunda isteğe yanıtın açıklanıp açıklanamayacağını belirtir.

Ama "maruz kalmanın" cevabının ne anlama geldiğini anlamıyorum.

Herkes bu başlığın true olarak ayarlandığını (true olarak ayarlanan kimlik bilgileri bayrağıyla bağlantılı olarak) açıklayabilir mi?


istemci tarafı üzerinde xhr.withCredential doc developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/...
Weishi Zeng

Yanıtlar:


265

Varsayılan olarak, CORS çapraz kökenli taleplerde çerez içermez. Bu JSON-P gibi diğer çapraz kökenli tekniklerden farklıdır. JSON-P her zaman isteği içeren çerezler içerir ve bu davranış siteler arası istek sahteciliği veya CSRF adı verilen bir güvenlik açığı sınıfına yol açabilir .

CORS'deki CSRF güvenlik açıklarının olasılığını azaltmak için, CORS hem sunucunun hem de istemcinin isteklere çerez eklemenin uygun olduğunu kabul etmesini gerektirir. Bunu yapmak, pasif bir şekilde kontrol olmadan gerçekleşen bir şey yerine, çerezleri aktif bir karar haline getirir.

İstemci kodu gerekir set withCredentialsmülk XMLHttpRequestiçin trueizin vermek için.

Ancak, bu başlık tek başına yeterli değildir. Sunucunun üstbilgiyle yanıt vermesi gerekirAccess-Control-Allow-Credentials . Bu üstbilgiye yanıt vermek true, sunucunun çapraz kaynak isteklerine çerezlerin (veya diğer kullanıcı kimlik bilgilerinin) eklenmesine izin verdiği anlamına gelir.

Kaynaklar arası kimlik bilgileri taleplerinin çalışmasını istiyorsanız tarayıcınızın üçüncü taraf çerezlerini engellemediğinden de emin olmanız gerekir .

Aynı kökenli veya çapraz kökenli istekte bulunmanıza bakılmaksızın, sitenizi CSRF'den korumanız gerektiğini unutmayın (özellikle isteğiniz çerezleri içeriyorsa).


1
Sorunuzu cevaplamak için cevabı açıklığa kavuşturdum. Temelde JSON-P yanlış yapar ve daha az güvenlidir.
monsur

28
Sadece "maruz" anlamı hakkında yorum yapmak için biraz eklemek istiyorum. Teknik özellik, GET istekleri için bir uçuş öncesi (sunucunun kimlik bilgilerine izin verip vermeyeceğini kontrol etmek için ek gidiş dönüş) gerektirmez. Ön kontrol yapmak yerine, tarayıcı her zaman istekte bulunur, withCredentialsayarlanmışsa çerez gönderir , ancak daha sonra yanıtı aldığında, Kimlik Bilgileri ayarlanmışsa, yalnızca yanıt Access'te olduğunda sonucu çağrı javascriptine gönderir / sunar. -Control-Allow-Credentials üstbilgi kümesi. Üstbilgi yoksa, yanıtı etkili bir şekilde karartmak için yanıtı açığa çıkarmaz.
heavi5ide

4
@ heavi5ide, Yea, tarayıcı istemci koduna yanıtı açmasa bile, çerezli istek yine de gönderildi (ön ödemesiz istekler için). Böylece CSRF yine de yapılacaktı.
Pacerier

7
Bu çok popüler bir yanıt olduğundan, bir önemli bilgi daha ekleyeceğim: İstek ve yanıt başlıklarınızı doğru şekilde yapılandırmanın yanı sıra, tarayıcınızın üçüncü taraf çerezlerini engellemediğinden de emin olmanız gerekir. kökenler arası kimlik bilgileri taleplerinin çalışmasını istiyorum. Bkz. Stackoverflow.com/a/16634887/2970321
alexw

5
Bu o kadar açık bir cevap ki, ilk kez okuyan herkes kodlarını çerezlerle iyi çalışmıyor gibi görünen kodlarını anlayabilir ve düzeltebilir. Teşekkürler!
16:06
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.