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

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ải SharedArrayBuffer 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-PolicyCross-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.

  1. Yêu cầu một mã thông báo cho máy chủ 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 đó:
    • 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

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

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