giriiş #
Web sitenizi COOP ve COEP kullanarak “kaynaklar arası izole” yapma bölümünde, COOP ve COEP kullanarak “kaynaklar arası izole” duruma nasıl geçileceğini açıkladık. Bu, tarayıcıda güçlü özellikleri etkinleştirmek için kaynaklar arası izolasyonun neden gerekli olduğunu açıklayan tamamlayıcı bir makaledir.
Arka plan #
Web, aynı kaynak ilkesi üzerine inşa edilmiştir: belgelerin ve komut dosyalarının başka bir kaynaktan gelen kaynaklarla nasıl etkileşime girebileceğini kısıtlayan bir güvenlik özelliği. Bu ilke, web sitelerinin kaynaklar arası kaynaklara erişme yollarını kısıtlar. Örneğin, bir belgeden
barındırılan verilere erişmesi engellenir.
https://b.example.
Ancak, aynı kaynak politikasının bazı tarihsel istisnaları olmuştur. Herhangi bir web sitesi şunları yapabilir:
- Kaynaklar arası iframe’leri gömme
- Görüntüler veya komut dosyaları gibi kaynaklar arası kaynakları dahil edin
- Bir DOM referansı ile kaynaklar arası açılır pencereleri açın
Web sıfırdan tasarlanabilseydi, 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 güveniyordu.
Böylesine gevşek bir aynı kaynak politikasının güvenlik yan etkileri iki şekilde yamalandı. Bunun bir yolu, adı verilen yeni bir protokolün tanıtılmasıydı. Kaynaklar Arası Kaynak Paylaşımı (CORS) amacı, sunucunun belirli bir kaynakla bir kaynağın paylaşılmasına izin verdiğinden emin olmaktır. Diğer yol ise, geriye dönük uyumluluğu korurken çapraz kaynaklara doğrudan komut dosyası erişimini dolaylı olarak kaldırmaktır. Bu tür kaynaklar arası kaynaklara “opak” kaynaklar denir. Örneğin, çapraz kaynaklı bir görüntünün piksellerini şu şekilde manipüle etmenin nedeni budur:
CanvasRenderingContext2D görüntüye CORS uygulanmadığı sürece başarısız olur.
Tüm bu ilke kararları, bir göz atma bağlam grubu içinde gerçekleşiyor.
Uzun bir süre boyunca, CORS ve opak kaynakların birleşimi, tarayıcıları güvenli hale getirmek için yeterliydi. Bazen Edge vakaları (örneğin JSON güvenlik açıkları) keşfedildi ve yamalanması gerekiyordu, ancak genel olarak, kaynaklar arası kaynakların ham baytlarına doğrudan okuma erişimine izin vermeme ilkesi başarılıydı.
Tüm bunlar değişti Hayalet, kodunuzla aynı göz atma bağlam grubuna yüklenen tüm verileri potansiyel olarak okunabilir hale getirir. Saldırganlar, belirli işlemlerin sürdüğü süreyi ölçerek CPU önbelleklerinin içeriğini ve bu sayede işlem belleğinin içeriğini tahmin edebilir. Bu tür zamanlama saldırıları, platformda bulunan düşük ayrıntı düzeyine sahip zamanlayıcılar ile mümkündür, ancak hem açık (ör.
performance.now()) ve örtülü (gibi
SharedArrayBufferS). Eğer
evil.com kaynaklar arası bir görüntüyü gömerlerse, piksel verilerini okumak için bir Spectre saldırısı kullanabilirler, bu da “opaklığa” dayanan korumaları etkisiz hale getirir.
İdeal olarak, tüm kaynaklar arası istekler, kaynağın sahibi olan sunucu tarafından açıkça incelenmelidir. Kaynak sahibi sunucu tarafından inceleme sağlanmazsa, veriler asla kötü bir aktörün göz atma bağlam grubuna giremez ve bu nedenle bir web sayfasının gerçekleştirebileceği herhangi bir Spectre saldırısının erişiminden uzak durur. Buna kökenler arası yalıtılmış durum diyoruz. COOP+COEP tam olarak bununla ilgili.
Kaynaklar arası yalıtılmış bir durumda, istekte bulunan site daha az tehlikeli kabul edilir ve bu, aşağıdakiler gibi güçlü özelliklerin kilidini açar:
SharedArrayBuffer,
performance.measureUserAgentSpecificMemory() Ve yüksek çözünürlüklü zamanlayıcılar Aksi takdirde Spectre benzeri saldırılar için kullanılabilecek daha iyi hassasiyetle. Ayrıca değiştirmeyi de engeller
document.domain.
Kaynaklar Arası Gömücü Politikası #
Çapraz Kaynak Yerleştirme Politikası (COEP) bir belgenin, belgeye açıkça izin vermeyen (CORP veya CORS kullanarak) kaynaklar arası kaynakları yüklemesini engeller. Bu özellik ile bir belgenin bu tür kaynakları yükleyemediğini beyan edebilirsiniz.
Bu politikayı etkinleştirmek için aşağıdaki HTTP başlığını belgeye ekleyin:
Cross-Origin-Embedder-Policy: require-corp
bu
require-corp anahtar sözcük, COEP için kabul edilen tek değerdir. Bu, belgenin yalnızca aynı kaynaktan gelen kaynakları veya başka bir kaynaktan yüklenebilir olarak açıkça işaretlenen kaynakları yükleyebileceği ilkesini zorunlu kılar.
Kaynakların başka bir kaynaktan yüklenebilmesi için, Kaynaklar Arası Kaynak Paylaşımını (CORS) veya Kaynaklar Arası Kaynak Politikasını (CORP) desteklemeleri gerekir.
Kaynaklar Arası Kaynak Paylaşımı #
img src="https://third-party.example.com/image.jpg" crossorigin>
Örneğin, bu görüntü kaynağına CORS üstbilgileri sunuluyorsa,
crossorigin özniteliği, kaynağı getirme isteğinin kullanacağı şekilde CORS modu. Bu, CORS başlıklarını ayarlamadığı sürece görüntünün yüklenmesini de engeller.
Benzer şekilde, çapraz kaynak verilerini
fetch() sunucu yanıt verdiği sürece özel işlem gerektirmeyen yöntem doğru HTTP başlıkları.
Kaynaklar Arası Kaynak Politikası #
Kaynaklar Arası Kaynak Politikası (CORP) başlangıçta, kaynaklarınızı başka bir kaynak tarafından yüklenmekten korumak için bir tercih olarak tanıtıldı. COEP bağlamında CORP, kaynağı kimin yükleyebileceği konusunda kaynak sahibinin politikasını belirtebilir.
bu
Cross-Origin-Resource-Policy başlık üç olası değer alır:
Cross-Origin-Resource-Policy: same-site
İşaretlenen kaynaklar
same-site sadece aynı siteden yüklenebilir.
Cross-Origin-Resource-Policy: same-origin
İşaretlenen kaynaklar
same-origin yalnızca aynı kaynaktan yüklenebilir.
Cross-Origin-Resource-Policy: cross-origin
İşaretlenen kaynaklar
cross-origin herhangi bir web sitesi tarafından yüklenebilir. (Bu değer CORP spesifikasyonuna COEP ile birlikte eklenmiştir.)
Çapraz Kaynak Açıcı Politikası #
Kaynaklar Arası Açıcı Politikası (COOP) üst düzey pencereyle doğrudan etkileşime girememeleri için onları farklı bir göz atma bağlam grubuna koyarak üst düzey bir pencerenin diğer belgelerden yalıtılmasını sağlamanıza olanak tanır. Örneğin, COOP’lu bir belge bir açılır pencere açarsa,
window.opener mülkiyet olacak
null. Ayrıca
.closed açıcının referansının özelliği geri dönecek
true.
bu
Cross-Origin-Opener-Policy başlık üç olası değer alır:
Cross-Origin-Opener-Policy: same-origin
İşaretlenen belgeler
same-origin aynı tarama içerik grubunu, yine açıkça işaretlenmiş aynı kaynaklı belgelerle paylaşabilir
same-origin.
Cross-Origin-Opener-Policy: same-origin-allow-popups
ile üst düzey bir belge
same-origin-allow-popups COOP ayarlamayan veya bir COOP ayarlayarak izolasyondan çıkmayı seçen açılır pencerelerinden herhangi birine referansları tutar.
unsafe-none.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none varsayılandır ve açıcının kendisinin bir COOP’si olmadıkça belgenin açıcının göz atma bağlam grubuna eklenmesine izin verir.
same-origin.
Özet #
gibi güçlü özelliklere garantili erişim istiyorsanız
SharedArrayBuffer,
performance.measureUserAgentSpecificMemory() veya yüksek çözünürlüklü zamanlayıcılar daha iyi hassasiyetle, belgenizin her iki COEP değerini de kullanması gerektiğini unutmayın.
require-corp ve COOP değeri ile
same-origin. Her ikisinin de olmaması durumunda tarayıcı, bu güçlü özellikleri güvenli bir şekilde etkinleştirmek için yeterli izolasyonu garanti etmez. Kontrol ederek sayfanızın durumunu belirleyebilirsiniz.
self.crossOriginIsolated İadeler
true.
COOP ve COEP kullanarak web sitenizi “kaynaklar arası izole” yapma bölümünden bunu uygulamaya yönelik adımları öğrenin.