Android Chrome 88 ve Masaüstü Chrome 92'de SharedArrayBuffer güncellemeleri

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çin SharedArrayBuffer 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.

  1. Kaynağınız için jeton isteyin.
  2. 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

Daha fazla bilgi

Daniel Gregoire'in Unsplash'teki banner fotoğrafı