SharedArrayBuffer
web'de zor bir geçiş yaşadı, ancak işler düzelmeye başladı. Şunları bilmeniz gerekir:
Kısaca
SharedArrayBuffer
şu anda Firefox 79 ve sonraki sürümlerde desteklenmektedir ve artık Android Chrome 88'de de kullanıma sunulacaktır. Ancak, bu özellik yalnızca kaynaklar arası erişime kapalı sayfalarda kullanılabilir.SharedArrayBuffer
, şu anda Masaüstü Chrome'da kullanılabilir ancak Chrome 92'de kökler arası erişime kapalı sayfalarla sınırlı olacaktır. Bu değişikliği zamanında yapamayacağınızı düşünüyorsanız en azından Chrome 113'e kadar geçerli davranışı korumak için kaynak denemesine kaydolabilirsiniz.- Kökler arası erişime kapalı
SharedArrayBuffer
özelliğini kullanmaya devam etmek istiyorsanız bunun web sitenizdeki diğer çapraz kaynak öğeler (ör. reklam yerleşimleri) üzerindeki etkisini değerlendirin. Etkiyi ve rehberi anlamak içinSharedArrayBuffer
hizmetinin üçüncü taraf kaynaklarınızdan herhangi biri tarafından kullanılıp kullanılmadığını kontrol edin.
Kökler arası erişime genel bakış
Bir sayfayı şu üst bilgilerle sunarak kaynaklar arası erişime kapalı yapabilirsiniz:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Bunu yaptığınızda, kaynak bir Cross-Origin-Resource-Policy
üst bilgisi veya CORS başlıkları (Access-Control-Allow-*
vb.) ile açıkça izin vermediği sürece sayfanız kaynaklar arası içeriği yükleyemez.
Ayrıca Reporting API vardır. Böylece Cross-Origin-Embedder-Policy
ve Cross-Origin-Opener-Policy
nedeniyle başarısız olan isteklerle ilgili veri toplayabilirsiniz.
Bu değişiklikleri Chrome 92'de zamanında yapamayacağınızı düşünüyorsanız en azından Chrome 113'e kadar geçerli Masaüstü Chrome davranışını korumak için kaynak deneme sürümüne kaydolabilirsiniz.
Çapraz kaynak izolasyonu hakkında daha fazla rehberlik ve bilgi için bu sayfanın alt kısmındaki Daha fazla bilgi bölümüne göz atın.
Buraya nasıl geldik?
SharedArrayBuffer
, Chrome 60'ta kullanıma sunuldu (yani Chrome sürümleri yerine tarihlerde
zaman düşünenleriniz Temmuz 2017'deydi) ve her şey harikaydı.
6 ay boyunca.
Ocak 2018'de bazı popüler CPU'larda güvenlik açığı tespit edildi. Tüm ayrıntılar için duyuruya bakın ancak temel olarak bu, 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, tarayıcı tedarikçilerimizin karşılaştığı bir sorundu. Web siteme gelirseniz, açık olan internet bankacılığı sitesinden hiçbir şeyi okuyamam. Hatta internet bankacılığı sitenizin açık olduğunu bilmeme gerek yok. Bunlar web güvenliğinin temelleridir.
Bu durumu 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ü içinde belleği değiştirerek ve tekrar başka bir iş parçacığında okuyarak SharedArrayBuffer
kullanarak yüksek çözünürlüklü bir zamanlayıcı oluşturabilirsiniz. Bu durum, iyi planlanmış kodlar ciddi şekilde etkilenmeden etkili bir şekilde azaltılamadığı için SharedArrayBuffer
birlikte devre dışı bırakıldı.
Çözüm, bir web sayfasının sistem işleminin başka bir yere ait hassas veriler içermemesini sağlamaktır. Chrome en başından itibaren çok işlemli bir mimariye yatırım yapmıştı (çizgi romanı hatırlıyor musunuz?) ancak birden fazla siteden gelen verilerin aynı sürece girebileceğ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 "eski" davranışı vardır. Bu özellik, diğer kaynaklardan gelen içeriklerin diğer kaynaktan alınmadan kullanılmasına olanak tanı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 kullanarak etkinleştirilmesini gerektirir.
Bu eski API'leri, "yanlış" görünüyorsa içeriğin web sayfası sürecine girmesini önleyerek ve kaynaklar arası okuma engelleme olarak adlandırarak geçici bir çözüm üzerinde çalıştık. Dolayısıyla, yukarıdaki durumlarda, bu API'lerin hiçbiri için geçerli bir biçim olmadığından JSON'un işleme girmesine izin verilmez. Yani iframe'ler hariçtir. iframe'ler için içeriği farklı bir işleme koyarız.
Bu çözümlerin uygulanmasıyla birlikte SharedArrayBuffer
uygulamasını Chrome 68'de (Temmuz 2018) yalnızca masaüstünde de kullanıma sunduk. Ek işlem gereksinimleri nedeniyle
aynı şeyi mobil cihazlarda da yapamıyorduk. Ayrıca, sadece 'yanlış' veri biçimlerini engellediğimiz için Chrome'un çözümünün tamamlanmamış olduğu da belirtildi. Tahmin edilebilir URL'lerdeki geçerli CSS/JS/images'in gizli veriler içermesi (anormal bir durum olsa da) mümkündür.
Web standartları insanları daha eksiksiz bir tarayıcılar arası çözüm bulmak için bir araya geldi. Çözüm, sayfalara "İşbu belgeyle, diğer kaynaklı içerikleri onayları olmadan bu sürece dahil etme yetkimden feragat ediyorum" şeklinde bir yöntem vermekti.
Bu beyan, sayfayla birlikte sunulan COOP ve COEP başlıkları aracılığıyla yapılır. Tarayıcı bunu zorunlu kılar ve bunun karşılığında sayfa, SharedArrayBuffer
ve benzer güçlere 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.
Firefox, 79 sürümünde (Temmuz 2020) bu kısıtlamayla SharedArrayBuffer
ürününü ilk kez gönderen taraf oldu.
Daha sonra, Ocak 2021'de ben bu makaleyi yazdım ve siz de okuyun. Merhaba,
Şu anda bu noktadayız. Chrome 88, kökler arası erişime kapalı sayfalar için SharedArrayBuffer
uygulamasını Android'e geri getirirken Chrome 92 hem tutarlılık hem de kökler arası tamamen izolasyonu sağlamak için aynı gereksinimleri masaüstüne getiriyor.
Masaüstü Chrome değişikliğini erteleme
Bu, kökler arası erişime kapalı sayfaları uygulamak için kullanıcılara daha fazla zaman veren "kaynak denemesi" şeklinde geçici bir istisnadır. Sayfanın kökler arası erişime kapalı olmasını gerektirmeden SharedArrayBuffer
özelliğini etkinleştirir. Bu istisna Chrome 113 sürümünde sona erer ve istisna yalnızca Masaüstü Chrome için geçerlidir.
- Kaynağınız için jeton isteyin.
- Jetonu sayfalarınıza ekleyin. Bunu yapmanın iki yolu vardır:
- Her sayfanın başına
origin-trial
<meta>
etiketi ekleyin. Bu, aşağıdaki gibi görünebilir:
<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- Sunucunuzu yapılandırabiliyorsanız jetonu bir
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
Daha fazla bilgi
- Çapraz kaynak izolasyonunu etkinleştirme rehberi
- Sayfalarınızı kökler arası şekilde ayırma
- Kaynaklar arası erişime kapalı neden gereklidir?
Daniel Gregoire'in Unsplash'teki banner fotoğrafı