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

SharedArrayBuffer'ın web'de biraz zorlu bir başlangıç yaptığını söyleyebiliriz ancak durum düzeliyor. Şunları bilmeniz gerekir:

Kısaca

  • SharedArrayBuffer şu anda Firefox 79 ve sonraki sürümlerde desteklenmektedir. Android Chrome 88'de de kullanıma sunulacaktır. Ancak bu özellik yalnızca kökler arası erişime kapalı olan sayfalarda kullanılabilir.
  • SharedArrayBuffer şu anda masaüstü Chrome'da kullanılabilir ancak Chrome 92'den itibaren çapraz kaynak izolasyonu uygulanmış 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 kaynak denemesine kaydolabilirsiniz.
  • SharedArrayBuffer kullanmaya devam etmek için kaynaklar arası izolasyonu etkinleştirmeyi planlıyorsanız bunun, web sitenizdeki reklam yerleşimleri gibi diğer kaynaklar arası öğeler üzerindeki etkisini değerlendirin. Etkiyi ve rehberliği anlamak için SharedArrayBuffer üçüncü taraf kaynaklarınızdan herhangi biri tarafından kullanılıp kullanılmadığını kontrol edin.

Kökler arası erişime kapalı bağlama genel bakış

Sayfayı aşağıdaki başlıklarla sunarak kökler arası erişime kapalı hale getirebilirsiniz:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

Bunu yaptığınızda, kaynak 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 merkezler arası içeriği yükleyemez.

Ayrıca, raporlama API'si de vardır. Bu sayede, Cross-Origin-Embedder-Policy ve Cross-Origin-Opener-Policy nedeniyle başarısız olan isteklerle ilgili verileri toplayabilirsiniz.

Bu değişiklikleri Chrome 92'ye kadar 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 rehberlik için bu sayfanın alt kısmındaki Daha fazla bilgi bölümüne göz atın.

Bu noktaya nasıl geldik?

SharedArrayBuffer, Chrome 60'ta (tarihleri Chrome sürümlerine tercih edenler için Temmuz 2017) kullanıma sunuldu ve her şey harikaydı. 6 ay boyunca.

Ocak 2018'de bazı popüler CPU'larda bir güvenlik açığı ortaya çıktı. Tam ayrıntılar için duyuruya bakın. Ancak bu güvenlik açığı, kodun erişmemesi gereken belleği okumak için yüksek çözünürlüklü zamanlayıcılar kullanabileceği anlamına geliyordu.

Tarayıcı satıcıları olarak, 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ğimiz için bu durum bizim için bir sorundu. Web siteme geldiğinizde, açık olan internet bankacılığı sitesinden hiçbir şey okuyamamalıyım. Hatta internet bankacılığı sitenizin açık olduğunu bile bilmemeliyim. Bunlar, web güvenliğinin temel unsurlarıdır.

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üde belleği değiştirip başka bir iş parçacığında geri okuyarak SharedArrayBuffer kullanarak yüksek çözünürlüklü bir zamanlayıcı oluşturabilirsiniz. Bu sorun, iyi niyetli kodları büyük ö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 sürecinin başka bir yerden gelen hassas veriler içermemesini sağlamaktır. Chrome, başlangıçtan itibaren çok süreçli bir mimariye yatırım yapmıştı (Çizgi romanı hatırlıyor musunuz?) ancak yine de birden fazla siteden gelen verilerin aynı süreçte yer alabileceği durumlar 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'ler, diğer kaynaklardaki içeriklerin diğer kaynaktan izin alınmadan kullanılmasına olanak tanıyan bir "eski" davranışa sahiptir. Bu istekler, diğer kaynağın çerezleriyle yapıldığından tam bir "oturum açılmış" isteğidir. Günümüzde yeni API'ler, diğer kaynağın CORS'u kullanarak etkinleştirilmesini gerektirir.

İçeriklerin "yanlış" görünmesi durumunda web sayfasının sürecine girmesini engelleyerek bu eski API'leri geçersiz kıldık ve bu işleme kaynaklar arası okuma engelleme adını verdik. Bu nedenle, yukarıdaki durumlarda JSON'ın işleme girmesine izin verilmez. Çünkü JSON, bu API'lerin hiçbiri için geçerli bir biçim değildir. Yani iframe'ler hariç. iFrame'lerde içeriği farklı bir işleme yerleştiririz.

Bu önlemler alındıktan sonra SharedArrayBuffer özelliğini Chrome 68'de (Temmuz 2018) yeniden kullanıma sunduk ancak bu özellik yalnızca masaüstü sürümünde kullanılabilir. Ek işlem gereksinimleri nedeniyle mobil cihazlarda aynı işlemi yapamıyorduk. Ayrıca, yalnızca "yanlış" veri biçimlerini engellediğimiz için Chrome'un çözümünün eksik olduğu belirtildi. Tahmin edilebilir URL'lerdeki geçerli CSS/JS/resimlerin özel veriler içermesi mümkün (ancak alışılmadık bir durum) olabilir.

Web standartları uzmanları, tarayıcılar arası daha eksiksiz bir çözüm bulmak için bir araya geldi. Çözüm olarak, sayfalara "Diğer kaynaklı içerikleri, kullanıcıların izni olmadan bu işleme dahil etme yetkimden feragat ediyorum" deme olanağı tanındı. Bu beyan, sayfayla birlikte sunulan COOP ve COEP üstbilgileri aracılığıyla yapılır. Tarayıcı bunu zorunlu kılar ve karşılığında sayfa, SharedArrayBuffer ve benzer yetkilere 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ümde (Temmuz 2020) bu kısıtlamayla birlikte SharedArrayBuffer'ı ilk sunan tarayıcı oldu.

Ardından, Ocak 2021'de bu makaleyi yazdım ve siz de okudunuz. Merhaba,

Şu anda bulunduğumuz nokta bu. Chrome 88, kökler arası erişimin kapatıldığı sayfalar için SharedArrayBuffer nesnesini Android'e geri getiriyor. Chrome 92 ise hem tutarlılık hem de tam kökler arası erişim izolasyonu sağlamak için aynı koşulları masaüstüne getiriyor.

Masaüstü Chrome değişikliğini erteleme

Bu, "kaynak denemesi" şeklinde geçici bir istisnadır ve kullanıcılara çapraz kaynak izolasyonlu sayfaları uygulamak için daha fazla zaman tanır. Sayfanın kökler arası erişime kapalı olmasını gerektirmeden SharedArrayBuffer özelliğini etkinleştirir. Bu istisna Chrome 113'te sona erer ve yalnızca masaüstü Chrome için geçerlidir.

  1. Kaynağınız için jeton isteğinde bulunun.
  2. 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 şöyle görünebilir:
      <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • Sunucunuzu yapılandırabiliyorsanız Origin-Trial HTTP üst bilgisini kullanarak da jeton ekleyebilirsiniz. Elde edilen yanıt başlığı şu şekilde görünmelidir:
      Origin-Trial: TOKEN_GOES_HERE

Daha fazla bilgi

Banner fotoğrafı: Daniel Gregoire (Unsplash)