SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
ve yüksek çözünürlüklü zamanlayıcı gibi güçlü özellikleri daha yüksek hassasiyetle kullanmak için kaynaklar arası erişime neden gerekli olduğunu öğrenin.
Giriş
COOP ve COEP kullanarak web sitenizi "kökenler arası izole" yapma bölümünde COOP ve COEP kullanarak "kökler arası erişime kapalı" durumuna nasıl geçeceğinizi açıklamıştık. Bu, tarayıcıda güçlü özellikleri etkinleştirmek için kökler arası erişime kapalı olmasının neden gerekli olduğunu açıklayan tamamlayıcı bir makaledir.
Arka plan
Web aynı kaynak politikası üzerine kuruludur. Bu güvenlik özelliği, dokümanların ve komut dosyalarının başka bir kaynaktan gelen kaynaklarla etkileşim kurma şeklini kısıtlayan bir özelliktir. Bu ilke, web sitelerinin kökler arası kaynaklara erişim yöntemlerini kısıtlar. Örneğin, https://a.example
kuruluşuna ait bir dokümanın https://b.example
adresinde barındırılan verilere erişmesi engellenir.
Ancak aynı kaynak politikasının geçmişte bazı istisnaları vardır. Tüm web siteleri:
- Kaynaklar arası iframe'leri yerleştirme
- Resimler veya komut dosyaları gibi kaynaklar arası kaynakları ekleyin
- DOM referansıyla kaynaklar arası pop-up pencereleri aç
Web sıfırdan tasarlansaydı bu istisnalar olmazdı. Ne yazık ki web topluluğu, katı bir aynı kaynak politikasının temel faydalarını fark ettiğinde web zaten bu istisnalara dayanıyordu.
Bu tür geçersiz aynı kaynak politikasının güvenlik yan etkileri iki şekilde yamalanmıştır. Bu yollardan biri, Ortamlar Arası Kaynak Paylaşımı (CORS) adı verilen yeni bir protokolün kullanıma sunulmasıydı. Bu protokolün amacı, sunucunun belirli bir kaynağa sahip kaynak paylaşımına izin vermesini sağlamaktır. Diğer yöntem ise geriye dönük uyumluluğu korurken kaynaklar arası kaynaklara doğrudan komut dosyası erişimini dolaylı yoldan kaldırmaktır. Kaynaklar arası bu tür kaynaklara "opak" kaynaklar denir. Örneğin, çapraz kaynak resmin piksellerini CanvasRenderingContext2D
aracılığıyla değiştirmenin, resme CORS uygulanmadığı sürece başarısız olmasının nedeni budur.
Tüm bu politika kararları, bir göz atma bağlam grubunda verilir.
Uzun bir süre, CORS ve opak kaynakların kombinasyonu tarayıcıları güvenli hale getirmek için yeterliydi. Bazen uç durumlar (JSON güvenlik açıkları gibi) keşfedildi ve yama uygulanması gerekiyordu, ancak genel olarak, kaynaklar arası kaynakların ham baytlarına doğrudan okuma erişimine izin vermeme ilkesi başarılı oldu.
Bunların tümü, kodunuzla aynı tarama içerik grubuna yüklenen tüm verilerin muhtemelen okunabilmesini sağlayan Spectre ile değişti. Saldırganlar, belirli işlemlerin süresini ölçerek CPU önbelleklerinin içeriğini ve bu aracılığıyla işlem belleğinin içeriğini tahmin edebilir. Bu tür zamanlama saldırıları, platformda bulunan düşük ayrıntılı zamanlayıcılarla mümkündür ancak hem açık (performance.now()
gibi) hem de örtülü (SharedArrayBuffer
gibi) yüksek ayrıntı düzeyine sahip zamanlayıcılarla hızlandırılabilir. evil.com
, kaynaklar arası bir resim yerleştirirse piksel verilerini okumak için bir Spectre saldırısı kullanabilir. Bu da, "opaklığa" dayalı korumaları etkisiz hale getirir.
İdeal olarak, tüm kaynaklar arası isteklerin, kaynağın sahibi olan sunucu tarafından açık bir şekilde incelenmesi gerekir. Kaynağın sahibi olan sunucu inceleme yapmazsa veriler hiçbir zaman kötü niyetli bir kişinin tarama bağlamı grubuna dahil edilmez ve bu nedenle bir web sayfasının yapabileceği Spectre saldırılarının erişim kapsamı dışında kalır. Kökler arası erişime kapalı durum diyoruz. COOP+COEP'in konusu da tam olarak budur.
Kaynaklar arası erişime kapalı bir durumda, istekte bulunan sitenin daha az tehlikeli olduğu kabul edilir. Böylece SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
ve yüksek çözünürlüklü zamanlayıcılar gibi güçlü özelliklerin daha yüksek hassasiyetle kilidini açar ve bu özellikler, aksi durumda Spectre benzeri saldırılar için kullanılabilecektir. Ayrıca document.domain
öğesinin değiştirilmesini de engeller.
Çapraz Kaynak Yerleştirme Politikası
Kaynaklar Arası Yerleştirme Politikası (COEP), bir dokümanın açıkça izin vermeyen (CORP veya CORS kullanarak) çapraz kaynak kaynakları yüklemesini engeller. Bu özellik sayesinde bir belgenin bu tür kaynakları yükleyemeyeceğini belirtebilirsiniz.
Bu politikayı etkinleştirmek için dokümana aşağıdaki HTTP üstbilgisini ekleyin:
Cross-Origin-Embedder-Policy: require-corp
require-corp
anahtar kelimesi, COEP için kabul edilen tek değerdir. Bu, belgenin yalnızca aynı kaynaktan kaynakları veya başka bir kaynaktan yüklenebilir olarak açıkça işaretlenmiş kaynakları yükleyebileceğini belirten politikayı uygular.
Kaynakların başka bir kaynaktan yüklenebilmeleri için Merkezler Arası Kaynak Paylaşımı'nı (CORS) veya Merkezler Arası Kaynak Politikası'nı (CORP) desteklemesi gerekir.
Merkezler Arası Kaynak Paylaşımı
Kaynaklar arası kaynak Ortamlar Arası Kaynak Paylaşımı'nı (CORS) destekliyorsa, kaynağı COEP tarafından engellenmeden web sayfanıza yüklemek için crossorigin
özelliğini kullanabilirsiniz.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Örneğin, bu görüntü kaynağı CORS başlıklarıyla sunuluyorsa kaynağı getirme isteğinin CORS modunu kullanması için crossorigin
özelliğini kullanın. Bu durum, CORS üst bilgilerini ayarlamadığı sürece resmin yüklenmesini de engeller.
Benzer şekilde, kaynaklar arası verileri fetch()
yöntemiyle getirebilirsiniz. Bu yöntem, sunucu doğru HTTP üst bilgileriyle yanıt verdiği sürece özel bir işlem gerektirmez.
Kaynaklar Arası Kaynak Politikası
Kaynaklar Arası Kaynak Politikası (CORP), başlangıçta kaynaklarınızın başka bir kaynak tarafından yüklenmesini önlemek için bir etkinleştirme seçeneği olarak kullanıma sunulmuştur. COEP bağlamında CORP, kaynak sahibinin bir kaynağı kimlerin yükleyebileceğine ilişkin politikasını belirtebilir.
Cross-Origin-Resource-Policy
başlığı üç olası değer alır:
Cross-Origin-Resource-Policy: same-site
same-site
işaretli kaynaklar yalnızca aynı siteden yüklenebilir.
Cross-Origin-Resource-Policy: same-origin
same-origin
işaretli kaynaklar yalnızca aynı kaynaktan yüklenebilir.
Cross-Origin-Resource-Policy: cross-origin
cross-origin
olarak işaretlenen kaynaklar herhangi bir web sitesi tarafından yüklenebilir. (Bu değer, COEP ile birlikte CORP spesifikasyonuna eklenmiştir.)
Çapraz Kaynak Açıcı Politikası
Çapraz Kaynak Açıcı Politikası (COOP), üst düzey bir pencerenin diğer belgelere farklı bir göz atma bağlam grubuna yerleştirilerek diğer dokümanlardan izole edilmesini sağlamanıza olanak tanır. Böylece, pencereler doğrudan üst düzey pencereyle etkileşimde bulunamaz. Örneğin, COOP içeren bir doküman pop-up açarsa window.opener
özelliği null
olur. Ayrıca, Opener'ın referansının .closed
özelliği true
değerini döndürür.
Cross-Origin-Opener-Policy
başlığı üç olası değer alır:
Cross-Origin-Opener-Policy: same-origin
same-origin
olarak işaretlenen dokümanlar, açık bir şekilde same-origin
olarak işaretlenmiş aynı kaynak dokümanlarla aynı tarama bağlam grubunu paylaşabilir.
Cross-Origin-Opener-Policy: same-origin-allow-popups
same-origin-allow-popups
değerine sahip üst düzey bir doküman, COOP özelliğini ayarlamamış veya unsafe-none
tutarında bir COOP ayarlayarak yalıtımı devre dışı bırakan tüm pop-up'larına referanslar saklar.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
varsayılan değerdir ve açan kişinin COOP'si same-origin
olmadığı sürece dokümanın, açıcının tarama bağlam grubuna eklenmesine izin verir.
Özet
SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
veya yüksek çözünürlüklü zamanlayıcılar gibi güçlü özelliklere daha yüksek hassasiyetle garantili erişim istiyorsanız dokümanınızın hem require-corp
değerine sahip COEP'yi hem same-origin
değerine sahip COOP'yi kullanması gerektiğini unutmayın. İkisi de yoksa tarayıcı bu güçlü özellikleri güvenli bir şekilde etkinleştirmek için yeterli yalıtım olmasını garanti etmez. self.crossOriginIsolated
işlevinin true
döndürüp döndürmediğini kontrol ederek sayfanızın durumunu belirleyebilirsiniz.
Bu sorunu uygulamak için izlenecek adımları COOP ve COEP kullanarak web sitenizi "çapraz kaynak izole etme" sayfasından öğrenebilirsiniz.