SharedArrayBuffer
'un web'de biraz zor bir başlangıç yaptığını söylemek doğru olsa da işler yavaş yavaş yoluna giriyor. Şunları bilmeniz gerekir:
Özet
SharedArrayBuffer
şu anda Firefox 79 ve sonraki sürümlerde desteklenmektedir. Android Chrome 88'de kullanıma sunulacaktır. Ancak bu özellik yalnızca kökler arası erişime kapalı sayfalarda kullanılabilir.SharedArrayBuffer
şu anda Masaüstü Chrome'da kullanılabilir ancak Chrome 92'den itibaren çapraz kaynak izolasyonu uygulanan sayfalarla sınırlı olacaktır. Bu değişikliği zamanında yapamayacağınızı düşünüyorsanız en az Chrome 113'e kadar mevcut davranışı korumak için bir kaynak denemesine kaydolabilirsiniz.SharedArrayBuffer
kullanmaya devam etmek için kaynak ayırma özelliğini etkinleştirmeyi düşünüyorsanız bunun web sitenizdeki diğer kaynak ayırma öğeleri (reklam yerleşimleri gibi) üzerindeki etkisini değerlendirin. Etkiyi ve yönlendirmeyi anlamak içinSharedArrayBuffer
'in üçüncü taraf kaynaklarınızdan herhangi biri tarafından kullanılıp kullanılmadığını kontrol edin.
Kökler arası erişime kapalılığa genel bakış
Bir sayfayı aşağıdaki üstbilgilerle sunarak kökler arası erişime kapalı hale getirebilirsiniz:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Bunu yaptıktan sonra, kaynak bir Cross-Origin-Resource-Policy
başlığı veya CORS başlıkları (Access-Control-Allow-*
vb.) aracılığıyla açıkça izin vermediği sürece sayfanız kaynaktan farklı kaynaktan içerik yükleyemez.
Cross-Origin-Embedder-Policy
ve Cross-Origin-Opener-Policy
nedeniyle başarısız olan istekler hakkında veri toplayabilmeniz için bir Reporting API de vardır.
Chrome 92'ye kadar bu değişiklikleri yapamayacağınızı düşünüyorsanız en azından Chrome 113'e kadar mevcut masaüstü Chrome davranışını korumak için bir kaynak denemesine kaydolabilirsiniz.
Kaynaklar arası izolasyon hakkında daha fazla bilgi ve yardım için bu sayfanın alt kısmındaki Daha fazla okuma bölümüne göz atın.
Bu noktaya nasıl geldik?
SharedArrayBuffer
, Chrome 60'ta kullanıma sunuldu (Chrome sürümleri yerine tarihlerle zaman belirtenler için Temmuz 2017). Her şey yolundaydı.
6 ay boyunca.
Ocak 2018'de bazı popüler CPU'larda bir güvenlik açığı tespit edildi. Ayrıntılı bilgi için duyuruyu inceleyin. Özetle, kodun erişmemesi gereken belleği okumak için yüksek çözünürlüklü zamanlayıcılar kullanabileceği anlamına geliyordu.
Sitelerin JavaScript ve WASM biçiminde kod yürütmesine izin vermek ancak bu kodun erişebileceği belleği sıkı bir şekilde kontrol etmek istediğimizden bu durum tarayıcı tedarikçileri için bir sorundu. Web siteme geldiğinizde, açık olan internet bankacılığı sitesinden hiçbir şey okuyamam. Aslında, internet bankacılığı sitenizin açık olduğunu bile bilmem gerekir. Bunlar web güvenliğinin temelleridir.
Bu sorunu azaltmak için performance.now()
gibi yüksek çözünürlüklü zamanlayıcılarımızın çözünürlüğünü düşürdük. Ancak bir çalışanda sıkı bir döngüde belleği değiştirip başka bir iş parçacığında tekrar okuyarak SharedArrayBuffer
kullanarak yüksek çözünürlüklü bir zamanlayıcı oluşturabilirsiniz. Bu sorun, iyi niyetli kodları önemli ölçüde etkilemeden etkili bir şekilde azaltılamadığından SharedArrayBuffer
tamamen devre dışı bırakıldı.
Genel bir azaltma yöntemi, bir web sayfasının sistem işleminin başka bir yerden alınan hassas veriler içermediğinden emin olmaktır. Chrome, başlangıçtan itibaren çok işlemli bir mimariye yatırım yapmıştı (Çizgi romanı hatırlıyor musunuz?). Ancak birden fazla siteden gelen verilerin aynı işleme düşebileceği durumlar hâlâ vardı:
<iframe src="https://your-bank.example/balance.json"></iframe>
<script src="https://your-bank.example/balance.json"></script>
<link rel="stylesheet" href="https://your-bank.example/balance.json" />
<img src="https://your-bank.example/balance.json" />
<video src="https://your-bank.example/balance.json"></video>
<!-- …and more… -->
Bu API'lerin, diğer kaynaklardan gelen içeriğin diğer kaynaktan etkinleştirme olmadan kullanılmasına izin veren "eski" bir davranışı vardır. Bu istekler, diğer kaynağın çerezleriyle yapılır. Bu nedenle, tam bir "giriş yapılmış" istektir. Günümüzde yeni API'ler, diğer kaynağın CORS'u kullanarak etkinleştirilmesini gerektiriyor.
"Yanlış" görünen içeriğin web sayfasının işlemine girmesini engelleyerek bu eski API'lerle ilgili sorunları giderdik ve bu işlemi kaynaklar arası okuma engelleme olarak adlandırdık. Bu nedenle, yukarıdaki durumlarda JSON'un sürece girmesine izin verilmez. Çünkü bu API'lerin hiçbiri için geçerli bir biçim değildir. Yani iframe'ler hariç. İçeriği, iframe'ler için farklı bir işleme koyarız.
Bu azaltıcı önlemleri uyguladıktan sonra, SharedArrayBuffer
'ü Chrome 68'de (Temmuz 2018) yalnızca masaüstünde yeniden kullanıma sunduk. Ek işlem şartları, mobil cihazlarda aynı işlemi yapamadığımız anlamına geliyordu. Ayrıca, yalnızca "yanlış" veri biçimlerini engellediğimiz için Chrome'un çözümünün eksik olduğu da belirtilmişti. Oysa tahmin edilebilir URL'lerdeki geçerli CSS/JS/resimlerin özel veriler içermesi mümkündür (yine de bu durum nadirdir).
Web standartları ekibi, tarayıcılar arası daha kapsamlı bir çözüm üretmek için bir araya geldi. Çözüm, sayfalara "Bu işleme diğer kaynaktan içerikleri, kaynak tarafından etkinleştirilmeden ekleme yetkimi iptal ediyorum" deme olanağı sunmaktı.
Bu beyan, sayfayla birlikte yayınlanan COOP ve COEP başlıkları aracılığıyla yapılır. Tarayıcı bunu zorunlu kılar ve karşılığında sayfa, SharedArrayBuffer
'e ve benzer özelliklere sahip diğer API'lere erişim kazanır. Diğer kaynaklar, Cross-Origin-Resource-Policy
veya CORS aracılığıyla içerik yerleştirmeyi etkinleştirebilir.
SharedArrayBuffer
'ü bu kısıtlamayla ilk kullanıma sunan Firefox oldu (79 sürümü, Temmuz 2020).
Ardından Ocak 2021'de bu makaleyi yazdım ve siz de bunu okudunuz. Merhaba,
Şu anda bu aşamadayız. Chrome 88, kökler arası izole edilmiş sayfalar için SharedArrayBuffer
'ü Android'e geri getiriyor. Chrome 92 ise hem tutarlılık hem de tam kökler arası izolasyon elde etmek için aynı koşulları masaüstüne getiriyor.
Masaüstü Chrome'daki değişikliğin ertelenmesi
Bu, kullanıcılara kökler arası erişime kapalı sayfaları uygulamak için daha fazla zaman tanıyan "kaynak deneme sürümü" şeklindeki geçici bir istisnadır. Sayfanın kökler arası erişime kapalı olması gerekmeden SharedArrayBuffer
'ü etkinleştirir. İstisnanın süresi Chrome 113'te dolacak ve istisna yalnızca masaüstü Chrome için geçerli olacak.
- Kaynağınız için jeton isteyin.
- Jetonu sayfalarınıza ekleyin. Bunu yapmanın iki yolu vardır:
- Her sayfanın başına bir
origin-trial
<meta>
etiketi ekleyin. Örneğin, bu şu şekilde görünebilir:
<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- Sunucunuzu yapılandırabiliyorsanız jetonu
Origin-Trial
HTTP üst bilgisi kullanarak da ekleyebilirsiniz. Elde edilen yanıt başlığı aşağıdaki gibi görünmelidir:
Origin-Trial: TOKEN_GOES_HERE
- Her sayfanın başına bir
Daha fazla bilgi
- Kaynaklar arası izolasyonu etkinleştirme kılavuzu
- Sayfalarınızı kaynaktan ayırma
- Kökler arası erişime kapalı olma özelliği neden gereklidir?
Daniel Gregoire'un Unsplash'taki banner fotoğrafı