Bản cập nhật SharedArrayBuffer trong Android Chrome 88 và Chrome 92 dành cho máy tính

Có thể nói rằng SharedArrayBuffer đã có một khởi đầu không mấy suôn sẻ trên web, nhưng mọi thứ đang dần ổ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ó trong Chrome 88 trên Android. Tuy nhiên, tính năng này chỉ dành cho những trang 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 từ Chrome 92, đối tượng này sẽ chỉ dùng được cho các trang được tách biệt nhiều nguồn gốc. Nếu không nghĩ rằng mình có thể thực hiện thay đổi này kịp thời, bạn có thể đăng ký dùng thử nguồn gốc để giữ lại hành vi hiện tại cho đến ít nhất là Chrome 113.
  • Nếu bạn dự định bật tính năng cách ly nhiều nguồn gốc để tiếp tục sử dụng SharedArrayBuffer, hãy đánh giá tác động của việc này đối với các phần tử nhiều nguồn gốc khác trên trang web của bạn, chẳng hạn như vị trí đặt quảng cáo. Kiểm tra xem SharedArrayBuffer có được bất kỳ tài nguyên nào của bên thứ ba sử dụng hay không để hiểu rõ 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 tách biệt nhiều nguồn gốc bằng cách phân phát trang có các tiêu đề sau:

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 thể tải nội dung nhiều nguồn gốc, trừ phi tài nguyên cho phép rõ ràng thông qua tiêu đề Cross-Origin-Resource-Policy hoặc tiêu đề CORS (Access-Control-Allow-*, v.v.).

Ngoài ra, còn có một API báo cáo để bạn có thể thu thập dữ liệu về những yêu cầu không thành công do Cross-Origin-Embedder-PolicyCross-Origin-Opener-Policy.

Nếu không thể thực hiện những thay đổi này kịp thời cho Chrome 92, bạn có thể đăng ký dùng thử nguồn gốc để giữ lại hành vi hiện tại của Chrome trên máy tính cho đến ít nhất là Chrome 113.

Hãy xem phần Tài liệu đọc thêm ở cuối trang này để biết thêm hướng dẫn và thông tin về tính năng cách ly nhiều nguồn gốc.

Làm thế nào chúng ta đến được đây?

SharedArrayBuffer xuất hiện trong Chrome 60 (tức là tháng 7 năm 2017, đối với những người nghĩ về thời gian theo ngày chứ không phải theo phiên bản Chrome), và mọi thứ đều ổn. Trong 6 tháng.

Vào tháng 1 năm 2018, một lỗ hổng bảo mật đã được phát hiện trong một số CPU phổ biến. Hãy xem thông báo để biết thông tin chi tiết. Về cơ bản, thông báo này có nghĩa là mã có thể sử dụng bộ hẹn giờ có độ phân giải cao để đọc bộ nhớ mà mã không được phép truy cập.

Đây là một vấn đề đối với chúng tôi (nhà cung cấp trình duyệt), vì chúng tôi muốn cho phép các trang web thực thi mã dưới dạng JavaScript và WASM, nhưng kiểm soát chặt chẽ bộ nhớ mà mã này có thể truy cập. Nếu bạn truy cập vào trang web của tôi, tôi không thể đọc bất cứ thông tin nào từ trang web ngân hàng trực tuyến mà bạn cũng đang mở. Trên thực tế, tôi không nên biết rằng bạn đang mở trang web ngân hàng trực tuyến. Đây là những kiến thức cơ bản về bảo mật web.

Để giảm thiểu vấn đề này, chúng tôi đã giảm độ phân giải của các bộ hẹn giờ có độ phân giải cao, chẳng hạn như performance.now(). Tuy nhiên, bạn có thể tạo một 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 lại bộ nhớ đó trong một luồng khác. Không thể giảm thiểu hiệu quả vấn đề này mà không ảnh hưởng lớn đến mã có ý định tốt, vì vậy, SharedArrayBuffer đã bị vô hiệu hoá hoàn toàn.

Một biện pháp 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. Ngay từ đầu, Chrome đã đầu tư vào một cấu trúc đa quy trình (bạn còn nhớ truyện tranh này không?), nhưng vẫn có những trường hợp dữ liệu từ nhiều trang web có thể nằm 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ó hành vi "cũ" cho phép sử dụng nội dung từ các nguồn gốc khác mà không cần chọn sử dụng từ nguồn gốc khác. Các 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 là yêu cầu "đã đăng nhập" đầy đủ. Ngày nay, các API mới yêu cầu nguồn gốc khác chọn sử dụng CORS.

Chúng tôi đã giải quyết các API cũ này bằng cách ngăn nội dung truy cập vào quy trình của trang nếu nội dung đó có vẻ "không chính xác", và gọi đó là chặn đọc chéo nguồn. 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, vì đây không phải là đị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 đặt nội dung vào một quy trình khác.

Sau khi áp dụng các biện pháp giảm thiểu này, chúng tôi đã giới thiệu lại SharedArrayBuffer trong Chrome 68 (tháng 7 năm 2018), nhưng chỉ trên máy tính. Các yêu cầu bổ sung về quy trình khiến chúng tôi không thể làm điều tương tự trên thiết bị di động. Ngoài ra, giải pháp của Chrome chưa hoàn chỉnh vì chúng tôi chỉ chặn các định dạng dữ liệu "không chính xác", trong khi có thể (mặc dù hiếm khi) các CSS/JS/hình ảnh hợp lệ tại các URL có thể đoán được có thể chứa dữ liệu riêng tư.

Các chuyên gia về tiêu chuẩn web đã cùng nhau đưa ra một giải pháp hoàn chỉnh hơn cho nhiều trình duyệt. Giải pháp là cho phép các trang nói rằng "Tôi xin từ bỏ khả năng đưa nội dung từ nguồn khác vào quy trình này mà không có sự đồng ý của họ". Bạn có thể khai báo thông qua tiêu đề COOP và COEP được phân phát cùng với trang. Trình duyệt sẽ thực thi điều đó và đổi lại, trang sẽ có quyền truy cập vào SharedArrayBuffer và các API khác có chức năng tương tự. Các nguồn khác có thể chọn nhúng nội dung thông qua Cross-Origin-Resource-Policy hoặc CORS.

Firefox là trình duyệt đầu tiên phát hành SharedArrayBuffer có hạn chế này, trong 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 nó. Xin chào.

Và đó là tình hình hiện tại. Chrome 88 đưa SharedArrayBuffer trở lại Android cho những trang được tách biệt nhiều nguồn gốc, còn Chrome 92 đưa ra các yêu cầu tương tự cho máy tính để bàn, cả về tính nhất quán và để đạt được chế độ tách biệt hoàn toàn nhiều nguồn gốc.

Hoãn thay đổi đối với Chrome trên máy tính

Đây là một trường hợp ngoại lệ tạm thời dưới dạng "thử nghiệm nguồn gốc" để mọi người có thêm thời gian triển khai các trang tách biệt nhiều nguồn gốc. API này cho phép SharedArrayBuffer mà không yêu cầu trang phải được tách biệt trên nhiều nguồn gốc. Ngoại lệ này sẽ hết hạn trong Chrome 113 và chỉ áp dụng cho Chrome trên máy tính.

  1. Yêu cầu mã thông báo cho nguồn gốc của bạn.
  2. 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 này:
    • Thêm thẻ origin-trial <meta> vào đầu mỗi trang. Ví dụ: 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 nhận được sẽ có dạng như sau:
      Origin-Trial: TOKEN_GOES_HERE

Tài liệu đọc thêm

Ảnh biểu ngữ của Daniel Gregoire trên Unsplash