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çinSharedArrayBuffer
üçü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.
- Kaynağınız için jeton isteğinde bulunun.
- 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
- Her sayfanın başına bir
Daha fazla bilgi
- Kökler arası erişimi kapatma kılavuzu
- Sayfalarınızı kaynaklar arası yalıtma
- Neden kökler arası erişime kapalı olması gerekir?
Banner fotoğrafı: Daniel Gregoire (Unsplash)