Bisa dibilang SharedArrayBuffer
mengalami sedikit kesulitan di
web, namun keadaan mulai melemah. Berikut hal yang perlu Anda ketahui:
Secara singkat
SharedArrayBuffer
saat ini didukung di Firefox 79+, dan akan tersedia di Android Chrome 88. Namun, fitur ini hanya tersedia untuk halaman yang diisolasi lintas origin.SharedArrayBuffer
saat ini tersedia di Chrome Desktop, tetapi dari Chrome 92 akan dibatasi untuk halaman yang diisolasi lintas origin. Jika menurut Anda Anda tidak dapat melakukan perubahan ini tepat waktu, Anda dapat mendaftar ke uji coba origin untuk mempertahankan perilaku saat ini hingga setidaknya Chrome 113.- Jika Anda ingin mengaktifkan isolasi lintas asal untuk terus menggunakan
SharedArrayBuffer
mengevaluasi dampak hal ini terhadap lintas origin lainnya di situs Anda, seperti penempatan iklan. Periksa apakahSharedArrayBuffer
digunakan oleh sumber daya pihak ketiga mana pun untuk memahami dampak dan panduan.
Ringkasan isolasi lintas asal
Anda dapat membuat halaman diisolasi lintas origin dengan menayangkan halaman menggunakan {i>header<i}:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Setelah Anda melakukannya, halaman Anda tidak akan dapat memuat konten lintas origin kecuali
resource secara eksplisit mengizinkannya melalui Cross-Origin-Resource-Policy
header atau header CORS
(Access-Control-Allow-*
dan sebagainya).
Ada juga reporting API, sehingga Anda
dapat mengumpulkan data tentang permintaan yang gagal sebagai akibat dari
Cross-Origin-Embedder-Policy
dan Cross-Origin-Opener-Policy
.
Jika Anda merasa tidak dapat melakukan perubahan ini pada waktunya untuk Chrome 92, Anda dapat daftar ke uji coba origin untuk mempertahankan Chrome Desktop saat ini hingga setidaknya Chrome 113.
Lihat bagian Bacaan lebih lanjut di bagian bawah halaman ini untuk mendapatkan panduan dan informasi lebih lanjut tentang isolasi lintas asal.
Bagaimana kita bisa sampai di sini?
SharedArrayBuffer
tiba di Chrome 60 (tanggal Juli 2017, bagi Anda yang
memikirkan waktu dalam tanggal daripada versi Chrome), dan semuanya berjalan lancar.
Selama 6 bulan.
Pada bulan Januari 2018, kerentanan terungkap di beberapa CPU populer. Lihat pengumuman mendapatkan detail selengkapnya, tetapi pada dasarnya ini berarti bahwa kode dapat menggunakan resolusi tinggi timer untuk membaca memori yang seharusnya tidak dapat diakses olehnya.
Ini menjadi masalah bagi kami, vendor {i>browser<i}, karena kami ingin mengizinkan situs untuk mengeksekusi kode dalam bentuk JavaScript dan WASM, tapi secara ketat mengontrol memori yang dapat diakses oleh kode tersebut. Jika Anda tiba di situs web saya, seharusnya saya tidak bisa membaca semua hal dari situs perbankan internet yang Anda buka. Seharusnya, saya tidak bahkan mengetahui bahwa situs perbankan internet Anda terbuka. Ini adalah dasar-dasar keamanan web.
Untuk mengurangi hal ini, kami mengurangi resolusi timer resolusi tinggi seperti
sebagai performance.now()
. Namun, Anda dapat membuat timer resolusi tinggi menggunakan
SharedArrayBuffer
dengan memodifikasi memori dalam loop padat di worker, dan membaca
kembali ke thread lain. Hal ini tidak dapat dimitigasi
secara efektif tanpa
sangat memengaruhi kode yang dimaksudkan dengan baik, sehingga SharedArrayBuffer
dinonaktifkan
secara menyeluruh.
Mitigasi umum adalah memastikan proses sistem laman web tidak berisi data sensitif dari tempat lain. Chrome telah berinvestasi dalam multi-proses arsitektur sejak awal (ingat komiknya?), tetapi ada masih terjadi kasus di mana data dari beberapa situs dapat berakhir dalam proses yang sama:
<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… -->
API ini memiliki API 'lama' perilaku yang memungkinkan konten dari asal lain digunakan tanpa persetujuan dari sumber lain. Permintaan ini dibuat dengan cookie dari origin yang lain, jadi ini adalah proses 'login' penuh permintaan. Saat ini, aplikasi baru API memerlukan asal lain untuk ikut serta menggunakan CORS.
Kami telah mengatasi API lama ini dengan mencegah konten memasuki proses halaman web Anda jika tampak 'salah', dan menyebutnya pemblokiran baca lintas origin. Jadi, dalam kasus di atas, kita tidak akan mengizinkan JSON memasuki proses, karena format yang valid untuk salah satu API tersebut. Artinya, kecuali iframe. Untuk iframe yang kita memasukkan konten ke proses yang berbeda.
Dengan menerapkan mitigasi ini, kami memperkenalkan kembali SharedArrayBuffer
di Chrome
68 (Juli 2018), tetapi hanya di desktop. Persyaratan proses tambahan
berarti kami
tidak dapat melakukan hal
yang sama di perangkat seluler. Perhatikan juga bahwa
solusi Chrome
tidak lengkap, karena kami hanya memblokir 'salah' format data, sedangkan
mungkin (meskipun tidak biasa) bahwa CSS/JS/image yang valid pada URL yang dapat ditebak dapat
berisi data pribadi.
Orang-orang berstandar web bersama-sama
menghasilkan desain lintas browser yang lebih lengkap
solusi. Solusinya adalah dengan memberikan cara agar laman dapat mengatakan "Dengan ini saya melepaskan
kemampuan untuk memasukkan konten asal lain ke dalam proses ini tanpa persetujuan mereka".
Pernyataan ini dilakukan melalui header COOP dan COEP
ditampilkan di halaman. Browser akan memberlakukan hal tersebut, dan sebagai gantinya, halaman akan memperoleh
akses ke SharedArrayBuffer
dan API lain dengan kemampuan yang sama. Asal lainnya
dapat mengaktifkan penyematan konten melalui
Cross-Origin-Resource-Policy
atau CORS.
Firefox adalah yang pertama mengirimkan SharedArrayBuffer
dengan batasan ini, di
versi 79 (Juli 2020).
Lalu, pada Januari 2021, saya menulis artikel ini dan Anda sudah membacanya. Halo.
Di situlah kita sekarang. Chrome 88 menghadirkan kembali SharedArrayBuffer
Android untuk halaman yang diisolasi lintas origin, dan Chrome 92 memberikan
persyaratan untuk desktop, baik untuk konsistensi, maupun untuk mencapai total
isolasi.
Menunda perubahan Chrome Desktop
Ini adalah pengecualian sementara dalam bentuk 'uji coba origin' yang memberi orang
lebih banyak waktu untuk menerapkan halaman yang diisolasi lintas origin. Hal ini memungkinkan
SharedArrayBuffer
tanpa mengharuskan halaman diisolasi lintas origin. Tujuan
akan berakhir di Chrome 113, dan pengecualian ini hanya berlaku untuk Desktop
Chrome.
- Minta token untuk origin Anda.
- Tambahkan token ke halaman Anda. Ada dua cara untuk melakukannya:
- Tambahkan tag
origin-trial
<meta>
ke bagian atas setiap halaman. Misalnya, URL tersebut mungkin terlihat seperti:
<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- Jika Anda dapat mengonfigurasi server, Anda juga dapat menambahkan token
menggunakan header HTTP
Origin-Trial
. {i>Header<i} respons yang dihasilkan harus terlihat seperti:
Origin-Trial: TOKEN_GOES_HERE
- Tambahkan tag
Bacaan lebih lanjut
- Panduan untuk mengaktifkan isolasi lintas asal
- Cara mengisolasi halaman dari lintas origin
- Alasan diperlukannya isolasi lintas asal
Foto banner oleh Daniel Gregoire di Unsplash