Công bằng mà nói, SharedArrayBuffer
đã gặp chút khó khăn trên
web nhưng mọi thứ đã ổn định. Dưới đây là những gì bạn cần phải biết:
Tóm tắt
SharedArrayBuffer
hiện được hỗ trợ trong Firefox 79 trở lên và sẽ có trên Android Chrome 88. Tuy nhiên, tính năng này chỉ dành cho các trang bị tách biệt nhiều nguồn gốc.SharedArrayBuffer
hiện có trong Chrome dành cho máy tính, nhưng có trong Chrome 92 sẽ bị giới hạn ở các trang tách biệt nhiều nguồn gốc. Nếu bạn không cho rằng mình có thể thực hiện thay đổi này kịp thời, bạn có thể đăng ký bản dùng thử theo nguyên gốc để duy trì hành vi hiện tại cho đến ít nhất là Chrome 113.- Nếu bạn định bật tính năng tách biệt nhiều nguồn gốc để tiếp tục sử dụng
SharedArrayBuffer
đánh giá tác động của thay đổi này đối với các nguồn khác trên trang web của mình, chẳng hạn như vị trí đặt quảng cáo. Kiểm tra xem có phảiSharedArrayBuffer
không được bất kỳ tài nguyên bên thứ ba nào của bạn sử dụng để tìm hiểu tác động và hướng dẫn.
Tổng quan về tính năng tách biệt nhiều nguồn gốc
Bạn có thể tạo một trang được tách biệt nhiều nguồn gốc bằng cách phân phát trang bằng những tiêu đề:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Sau khi bạn thực hiện việc này, trang của bạn sẽ không tải được nội dung trên nhiều nguồn gốc, trừ phi
tài nguyên cho phép nó một cách rõ ràng thông qua Cross-Origin-Resource-Policy
hoặc tiêu đề CORS
(Access-Control-Allow-*
, v.v.).
Ngoài ra còn có API báo cáo, vì vậy, bạn
có thể thu thập dữ liệu về các yêu cầu không thành công do
Cross-Origin-Embedder-Policy
và Cross-Origin-Opener-Policy
.
Nếu bạn không cho rằng mình có thể thực hiện những thay đổi này kịp thời cho Chrome 92, bạn có thể đăng ký bản dùng thử theo nguyên gốc để giữ lại Chrome dành cho máy tính hiện tại cho đến ít nhất là Chrome 113.
Hãy xem phần Đọc thêm ở cuối trang này để biết thêm hướng dẫn và thông tin về cách tách biệt nhiều nguồn gốc.
Chúng tôi có mặt ở đây bằng cách nào?
SharedArrayBuffer
đã có mặt trên Chrome 60 (tức là tháng 7 năm 2017, dành cho những người trong số các bạn
nghĩ đến thời gian thay vì phiên bản Chrome) và mọi thứ đều tuyệt vời.
Trong 6 tháng.
Vào tháng 1 năm 2018, một lỗ hổng bảo mật đã bị lộ trong một số CPU phổ biến. Xem thông báo để biết toàn bộ chi tiết, nhưng về cơ bản, điều đó có nghĩa là mã có thể sử dụng độ phân giải cao đồng hồ hẹn giờ đọc bộ nhớ mà lẽ ra không có quyền truy cập vào.
Đây là một vấn đề đối với các nhà cung cấp trình duyệt của chúng tôi, vì chúng tôi muốn cho phép các trang web thực thi dưới dạng JavaScript và WASM, nhưng kiểm soát chặt chẽ bộ nhớ mà mã có thể truy cập. Nếu bạn truy cập vào trang web của tôi, tôi sẽ không đọc được bất cứ thứ gì từ trang web ngân hàng trực tuyến mà bạn cũng mở. Thực ra, tôi không nên biết rằng bạn đã mở trang web ngân hàng trực tuyến. Đây là những nguyên tắc cơ bản về bảo mật web.
Để giảm thiểu điều này, chúng tôi đã giảm độ phân giải của bộ hẹn giờ có độ phân giải cao, chẳng hạn như
với tên performance.now()
. Tuy nhiên, bạn có thể tạo bộ hẹn giờ có độ phân giải cao bằng cách sử dụng
SharedArrayBuffer
bằng cách sửa đổi bộ nhớ trong một vòng lặp chặt chẽ trong một worker và đọc
quay lại chuỗi bài đăng đó trong chuỗi khác. Không thể giảm thiểu hiệu quả vấn đề này nếu không có
ảnh hưởng nghiêm trọng đến mã có ý định rõ ràng, vì vậy SharedArrayBuffer
đã bị vô hiệu hoá
hoàn toàn.
Cách giảm thiểu chung là đảm bảo quy trình hệ thống của trang web không chứa dữ liệu nhạy cảm từ nơi khác. Chrome đã đầu tư vào một quy trình đa tiến trình cấu trúc của bạn ngay từ đầu (bạn có nhớ truyện tranh không?), nhưng có vẫn là trường hợp dữ liệu từ nhiều trang web có thể đến trong cùng một quy trình:
<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… -->
Các API này có "cũ" hành vi cho phép nội dung từ các nguồn khác được sử dụng mà không chọn tham gia từ nguồn gốc khác. Những yêu cầu này được thực hiện bằng cookie của nguồn gốc khác, vì vậy đây sẽ là trạng thái "đăng nhập" hoàn toàn của bạn. Ngày nay, mới API yêu cầu nguồn gốc khác để chọn tham gia bằng CORS.
Chúng tôi đã khắc phục các API cũ này bằng cách ngăn nội dung truy cập vào của trang web đó có vẻ "không chính xác" hay không và gọi là chặn đọc trên nhiều nguồn gốc. Vì vậy, trong các trường hợp trên, chúng tôi sẽ không cho phép JSON tham gia vào quy trình này vì điều này không phải là một định dạng hợp lệ cho bất kỳ API nào trong số đó. Tức là, ngoại trừ iframe. Đối với iframe, chúng tôi đưa nội dung vào một tiến trình khác.
Với các giải pháp giảm thiểu này, chúng tôi đã ra mắt lại SharedArrayBuffer
trong Chrome
68 (tháng 7 năm 2018), nhưng chỉ có trên máy tính. Để đáp ứng các yêu cầu bổ sung về quy trình, chúng tôi
không thể làm tương tự trên thiết bị di động. Cần lưu ý rằng giải pháp của Chrome
chưa hoàn tất, do chúng tôi chỉ chặn "không chính xác" trong khi đó
có thể (mặc dù bất thường) mà CSS/JS/hình ảnh hợp lệ tại các URL có thể đoán được
chứa dữ liệu riêng tư.
Các chuyên gia tiêu chuẩn web cùng nhau tạo ra một trình duyệt hoàn chỉnh hơn
Cloud. Giải pháp là tạo cho các trang một cách thể hiện rằng "Tôi đã từ bỏ
đưa nội dung có nguồn gốc khác vào quy trình này mà không cần họ chọn cho phép".
Nội dung khai báo này được thực hiện thông qua tiêu đề COOP và COEP
được phân phát cùng với trang. Trình duyệt thực thi việc đó và đổi lại, trang sẽ được tăng
quyền truy cập vào SharedArrayBuffer
và các API khác có quyền hạn tương tự. Các nguồn gốc khác
có thể chọn tham gia nhúng nội dung qua
Cross-Origin-Resource-Policy
hoặc CORS.
Firefox là quốc gia đầu tiên vận chuyển SharedArrayBuffer
có hạn chế này, tính theo
phiên bản 79 (tháng 7 năm 2020).
Sau đó, vào tháng 1 năm 2021, tôi đã viết bài viết này và bạn đã đọc bài viết đó. Xin chào.
Và đó là kết quả của chúng tôi bây giờ. Chrome 88 giúp SharedArrayBuffer
hoạt động trở lại
Android cho các trang được tách biệt nhiều nguồn gốc và Chrome 92 cũng mang lại điều tương tự
các yêu cầu đối với máy tính, vừa đảm bảo tính nhất quán vừa đảm bảo đạt được toàn bộ các yêu cầu trên nhiều nguồn gốc
tách biệt.
Đang trì hoãn thay đổi Chrome dành cho máy tính để bàn
Đây là một trường hợp ngoại lệ tạm thời dưới hình thức "dùng thử theo nguyên gốc" mang lại cho mọi người
để triển khai các trang tách biệt nhiều nguồn gốc. Chiến dịch này cho phép
SharedArrayBuffer
mà không yêu cầu trang phải tách biệt nhiều nguồn gốc. Chiến lược phát hành đĩa đơn
ngoại lệ sẽ hết hạn trong Chrome 113 và ngoại lệ chỉ áp dụng cho Máy tính
Chrome.
- Yêu cầu một mã thông báo cho máy chủ gốc của bạn.
- Thêm mã thông báo vào các trang của bạn. Có hai cách để thực hiện việc đó:
- Thêm một thẻ
origin-trial
<meta>
vào đầu mỗi trang. Ví dụ: đoạn mã này có thể có dạng như sau:
<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- Nếu có thể định cấu hình máy chủ, bạn cũng có thể thêm mã thông báo
bằng tiêu đề HTTP
Origin-Trial
. Tiêu đề phản hồi thu được sẽ sẽ có dạng như sau:
Origin-Trial: TOKEN_GOES_HERE
- Thêm một thẻ
Tài liệu đọc thêm
- Hướng dẫn bật tính năng tách biệt nhiều nguồn gốc
- Cách tách riêng các trang trên nhiều nguồn gốc
- Tại sao bạn cần tách biệt nhiều nguồn gốc
Ảnh biểu ngữ của Daniel Gregoire trên Unsplash