Kökler Arası Kaynak Paylaşımı

Vikipedi, özgür ansiklopedi
Şuraya atla: kullan, ara

Cross-Origin Resource Sharing (CORS), bir web sayfası üzerindeki bazı kaynakların (örneğin font dosyaları), kaynağın sunulduğu alan adının dışındaki bir alan adından istenebilmesine izin veren bir mekanizmadır. Bir web sayfası, özgürce kökler arası resimleri, stil sayfalarını, betikleri ve videoları ekleyebilmektedir.[1] Ancak, bazı “alanlar arası” istekler, özellikle Ajax istekleri, Aynı Kök Politikası nedeniyle varsayılan olarak yasaklanmıştır.

CORS, kökler arası isteklerin güvenli olup olmadığına karar vermek için tarayıcı ve sunucu arasında bir etkileşimin nasıl yapılacağını tanımlamaktadır.[2] Aynı kök isteklerine oranla daha fazla özgürlük ve işlevsellik sağlamaktadır, ancak basitçe tüm kökler arası isteklere izin vermekten daha güvenlidir. W3C tarafından da önerilen standart olmuştur.[3]

CORS güvenlik ile ilgili değildir, içerik sahipliğinin korunması ile ilgilidir. Saldırganların Aynı Kök Politikası'na (SOP) uyması beklenmemelidir. CORS pek çok tarayıcı üzerinden kolayca devre dışı bırakılabilmektedir.

  CORS nasıl çalışır?[değiştir | kaynağı değiştir]

CORS standardı, tarayıcı ve sunucuların izinleri olması halinde uzak URL’lere istekte bulunabileceği bir yöntem sunan yeni HTTP başlıkları tanımlamaktadır. Bazı doğrulama ve yetkilendirme sunucu tarafından yapılsa da, bu başlıkları desteklemek ve belirttikleri kısıtlamaları uygulamak tarayıcıların sorumluluğundadır.

Veriyi değiştirebilen Ajax ve HTTP istek metotları (genellikle GET dışındaki HTTP metotları veya bazı MIME türleri ile POST kullanımı) için, tanımlama, tarayıcıların sunucudan HTTP OPTIONS istek metodu ile desteklenen metotları öğrenerek ve sunucudan onay aldıktan sonra asıl HTTP metodu ile asıl isteği göndererek bir ön kontrol yapmalarını zorunlu tutmaktadır. Sunucular, login bilgilerinin (çerezler ve HTTP kimlik doğrulama verisi dahil) isteklerle birlikte gönderilip gönderilememesi konusunda istemcileri de bilgilendirebilmektedir.[4]

Flowchart showing Simple and Preflight XHR.svg

Basit bir örnek[değiştir | kaynağı değiştir]

Aynı Kök Politikası kullanılırken, genelde uygun olmamaktadır. CORS uyumlu bir tarayıcı kökler arası bir istek yapmak istediğinde:

  1. Tarayıcı HTTP  Origin başlığı ile bir OPTIONS isteği göndermektedir. Bu başlığın değeri, ana sayfayı sunan alan adı olmaktadır. http://example.com alan adından bir sayfa, service.example.com üzerindeki bir kullanıcı verisine erişmek istediğinde, aşağıdaki istek başlığı service.example.com’a gönderilecektir:
    Origin: http://www.example.com
    
  2. service.example.com üzerindeki sunucunun cavabı aşağıdakileri içerebilir:
    • Hangi kök sayfalarına izin verildiğini gösteren bir Access-Control-Allow-Origin (ACAO) başlığı. Örneğin:
      Access-Control-Allow-Origin: http://www.example.com
      
    • Eğer sunucu kökler arası isteklere izin vermiyorsa bir hata sayfası
    • Tüm alan adlarına izin veren bir karakter içeren Access-Control-Allow-Origin (ACAO) başlığı:
      Access-Control-Allow-Origin: *
      

Bir karakter aynı kök politikası, bir sayfa veya API tamamen erişilebilir bir içerik olarak düşünüldüğünde ve herhangi bir site üzerindeki herhangi bir kod dahil herkes için erişilebilir olması amaçlandığında uygundur. Örneğin, Google Fonts gibi genel bir servis sunucusu üzerindeki bir web fontu.

Yıldız karakterli aynı kök politikası, sayfaların tahmin edilemez URL’lere sahip olduğu ve bunu bilen kişiler tarafından erişilebilir olduğu varsayılan nesne yeterlilik modelinde yaygın olarak kullanılmaktadır.

“*” değeri, HTTP kimlik doğrulama, istemci taraflı SSL sertifikaları ve çerezlerin gönderilmesine izin vermemesi açısından önem taşımaktadır.[5]

CORS mimarisinde, ACAO başlığı asıl web uygulama sunucusu (www.example.com) tarafından değil harici web servisi (service.example.com) tarafından belirlenmektedir. CORS, web servisin web uygulamasına kaynaklarını kullanması için yetkilendirmesine izin vermektedir ve uygulama tarafından erişilen harici servisleri kontrol etmemektedir. İkincisi için, İçerik Güvenlik Politikası kullanılmalıdır (connect-src direktifi).

Ön Kontrol örneği[değiştir | kaynağı değiştir]

Bazı kökler arası Ajax istekleri gönderilirken, CORS’u destekleyen modern tarayıcılar, belirtilen aksiyonu yapma yetkisinin olup olmadığına karar vermek için ilave bir "ön kontrol" isteği eklemektedir.

OPTIONS /
Host: service.example.com
Origin: http://www.example.com

Eğer service.example.com isteği kabul etmek istiyorsa, aşağıdaki başlıklarla cevap verebilir:


Access-Control-Allow-Origin: http://www.example.com Access-Control-Allow-Methods: PUT, DELETE

Başlıklar[değiştir | kaynağı değiştir]

CORS ile ilgili HTTP başlıkları

İstek başlıkları[değiştir | kaynağı değiştir]

  • Origin
  • Access-Control-Request-Method
  • Access-Control-Request-Headers

Cevap başlıkları[değiştir | kaynağı değiştir]

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials
  • Access-Control-Expose-Headers
  • Access-Control-Max-Age
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers

Tarayıcı Desteği[değiştir | kaynağı değiştir]

CORS, aşağıdaki tarayıcı görüntüleme motorlarına dayanan tüm tarayıcılar tarafından desteklenmektedir:

Aşağıdaki tarayıcılarda CORS desteği bulunmamaktadır:

  • Camino 2.0.x sürümlerinde CORS'u uygulamamaktadır, çünkü bu sürümler Gecko 1.9.0 tabanlıdır.[16]
  • 0.10.2 versiyonu ile beraber, Arora WebKit'in CORS ile ilgili API'lerini kullanmaktadır, ancak kökler arası istekler başarısız olmaktadır.[17]

Tarih[değiştir | kaynağı değiştir]

Kökler arası destek, VoiceXML tarayıcılarında güvenli kökler arası veri isteklerine izin vermek için VoiceXML 2.1[18] sürümünde yer alması için Mart 2004'de Tellme Networks çalışanlarından Matt Oshry, Brad Porter ve Michael Bodell tarafından önerilmiştir. Mekanizma VoiceXML’e özgü olmayan genel bir yapıya sahip olarak kabul edilmiştir ve sonrasında bir uygulama notu olarak ayrılmıştır.[19] Ana tarayıcı sağlayıcılarından katılımcılarla birlikte W3C WebApps Çalışma Grubu, bu notu resmi W3C Öneri durumuna getirmek üzere W3C Çalışma Taslağı olarak resmileştirmeye başlamıştır.

Mayıs 2006'da ilk W3C Çalışma Taslağı sunulmuştur.[20] Mart 2009'da taslak "Cross Origin Resource Sharing"[21] olarak isim değiştirmiştir ve Ocak 2014'de bir W3C Önerisi olarak kabul edilmiştir.[22]

CORS vs JSONP[değiştir | kaynağı değiştir]

CORS, JSONP’ye karşı modern bir alternatif olarak da kullanılabilmektedir. JSONP sadece GET isteklerini desteklerken, CORS diğer HTTP istek türlerini de desteklemektedir. CORS kullanımı, JSONP’den daha iyi hata işleme imkanları sunan XMLHttpRequest’lerin web programcıları tarafından kullanılabilmesine imkan tanımaktadır. CORS pek çok modern tarayıcı tarafından desteklenmektedir. JSONP, harici site ele geçirildiğinde siteler arası betik çalıştırma (XSS) sorunlarına yol açabilirken, CORS güvenliği sağlamak için web sayfalarının cevapları manuel olarak işlemesine izin vermektedir.[23]

Ayrıca Bkz.[değiştir | kaynağı değiştir]

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ "Same-origin policy / Cross-origin network access". MDN. 12 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170312160714/https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy. 
  2. ^ "Cross-domain Ajax with Cross-Origin Resource Sharing". NCZOnline. 29 Nisan 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160429013208/https://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/. Erişim tarihi: 2012-07-05. 
  3. ^ "Cross-Origin Resource Sharing". 6 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170306094742/http://www.w3.org/TR/cors/. 
  4. ^ "cross-site xmlhttprequest with CORS". MOZILLA. 21 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170321105753/https://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/. Erişim tarihi: 2012-09-05. 
  5. ^ Cross-Origin Resource Sharing.
  6. ^ "Blink". QuirksBlog. April 2013. 29 Aralık 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20161229193214/http://www.quirksmode.org/blog/archives/2013/04/blink.html. Erişim tarihi: 4 April 2013. 
  7. ^ "Google going its own way, forking WebKit rendering engine". Ars Technica. April 2013. http://arstechnica.com/information-technology/2013/04/google-going-its-own-way-forking-webkit-rendering-engine/. Erişim tarihi: 4 April 2013. 
  8. ^ "HTTP access control (CORS) - MDN". Developer.mozilla.org. 15 Temmuz 2012 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20120715215322/https://developer.mozilla.org/en/http_access_control. Erişim tarihi: 2012-07-05. 
  9. ^ "Gecko - MDN". Developer.mozilla.org. 2012-06-08. 3 Ağustos 2012 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20120803092112/https://developer.mozilla.org/en/Gecko. Erişim tarihi: 2012-07-05. 
  10. ^ "What makes Camino Special". 8 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160908144609/http://caminobrowser.org:80/features/. Erişim tarihi: 2013-02-20. 
  11. ^ Tony Ross; Program Manager; Internet Explorer (2012-02-09). "CORS for XHR in IE10". MSDN. 5 Aralık 2015 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20151205151731/http://blogs.msdn.com:80/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx. Erişim tarihi: 2012-12-14. 
  12. ^ David Honneffer, Documentation Specialist (2012-06-14). "12.00 for UNIX Changelog". Opera. 5 Haziran 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160605160453/http://www.opera.com/docs/changelogs/unix/1200/. Erişim tarihi: 2012-07-05. 
  13. ^ David Honneffer, Documentation Specialist (2012-04-23). "Opera Software: Web specifications support in Opera Presto 2.10". Opera.com. 11 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160911011848/http://www.opera.com:80/docs/specs/presto2.10/. Erişim tarihi: 2012-07-05. 
  14. ^ on July 6, 2009 by Arun Ranganathan (2009-07-06). "cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog". Hacks.mozilla.org. 21 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170321105753/https://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/. Erişim tarihi: 2012-07-05. 
  15. ^ "59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass". Osvdb.org. http://osvdb.org/59940. Erişim tarihi: 2012-07-05. 
  16. ^ "HTTP Access Control in Camino • mozillaZine Forums". Forums-test.mozillazine.org. 3 Mart 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160303184907/http://forums-test.mozillazine.org/viewtopic.php?f=12&t=1579855. Erişim tarihi: 2012-07-05. 
  17. ^ "Issue 904 - arora - Arora providing API for CORS (Cross-Origin Resource Sharing) but fails in actual use - Cross Platform WebKit Browser - Google Project Hosting". Code.google.com. 2010-09-04. 17 Mayıs 2015 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20150517081757/https://code.google.com/p/arora/issues/detail?id=904. Erişim tarihi: 2012-07-05. 
  18. ^ "Voice Extensible Markup Language (VoiceXML) 2.1". W3.org. 2004-03-23. 23 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160923144412/http://www.w3.org:80/TR/2004/WD-voicexml21-20040323/. Erişim tarihi: 2012-07-05. 
  19. ^ "Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0". W3.org. 19 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170319185517/http://www.w3.org/TR/2005/NOTE-access-control-20050613/. Erişim tarihi: 2012-07-05. 
  20. ^ "Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0 W3C - Working Draft 17 May 2006". W3.org. 2 Nisan 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160402134726/http://www.w3.org/TR/2006/WD-access-control-20060517/. Erişim tarihi: 17 August 2015. 
  21. ^ "Cross-Origin Resource Sharing - W3C Working Draft 17 March 2009". W3.org. 17 Nisan 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160417230432/http://www.w3.org/TR/2009/WD-cors-20090317/. Erişim tarihi: 17 August 2015. 
  22. ^ "Cross-Origin Resource Sharing - W3C Recommendation 16 January 2014". W3.org. 17 Haziran 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160617165620/http://www.w3.org/TR/2014/REC-cors-20140116/. Erişim tarihi: 17 August 2015. 
  23. ^ "When can I use... Cross Origin Resource Sharing". caniuse.com. 8 Nisan 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170408034823/http://caniuse.com/. Erişim tarihi: 2012-07-12. 

Dış bağlantılar[değiştir | kaynağı değiştir]