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

Thật công bằng khi nói rằng SharedArrayBuffer đã có một chút gián đoạ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ó trong Android Chrome 88. Tuy nhiên, tính năng này chỉ dành cho những trang được tách riêng trên nhiều nguồn gốc.
  • SharedArrayBuffer hiện có trong Chrome dành cho máy tính. Tuy nhiên, từ Chrome 92, tính năng này sẽ bị giới hạn ở các trang được tách riêng trên nhiều nguồn gốc. Nếu cho rằng mình không thể thực hiện thay đổi này kịp thời, thì 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 Chrome 113 trở lên.
  • Nếu bạn dự đị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, 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 có tài nguyên bên thứ ba nào sử dụng SharedArrayBuffer hay không để nắm được 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ể làm cho một trang được tách biệt trên nhiều nguồn gốc bằng cách phân phát trang với 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ó 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 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, thì 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 của Chrome trên máy tính 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ề tính năng tách biệt nhiều nguồn gốc.

Chúng tôi đến đây bằng cách nào?

SharedArrayBuffer đã có mặt trên Chrome 60 (vào tháng 7 năm 2017, đối với những bạn nghĩ về thời gian chứ không phải là phiên bản Chrome), và mọi thứ đều thật tuyệt. Trong 6 tháng.

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

Đây là 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 mã dưới dạng JavaScript và WASM, nhưng kiểm soát nghiêm ngặt 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 sẽ không thể đọc được bất cứ điều gì từ trang web ngân hàng trực tuyến mà bạn mở. Trên thực tế, tôi thậm chí không biết 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 các đồng hồ hẹn giờ có độ phân giải cao như performance.now(). Tuy nhiên, bạn có thể tạo một bộ tính giờ có độ phân giải cao bằ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 chuỗi khác. Việc này không thể giảm thiểu một cách hiệu quả nếu không ảnh hưởng nghiêm trọng đến mã có ý định tốt, vì vậy, SharedArrayBuffer đã bị vô hiệu hoá hoàn toàn.

Một giải 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 cấu trúc đa tiến trình (bạn có 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ể rơi vào 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 khác mà không cần chọn sử dụng nội dung 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, đó là một yêu cầu 'đăng nhập' đầy đủ. Hiện nay, các API mới yêu cầu nguồn gốc khác để chọn tham gia bằng cách sử dụng CORS.

Chúng tôi đã xử lý các API cũ này bằng cách ngăn nội dung tham gia vào quy trình của trang web nếu trang web đó trông "không chính xác" 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 nhập quy trình này vì đây không phải là định dạng hợp lệ cho bất kỳ API nào trong số đó. Nghĩa 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.

Với những 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ỉ trên máy tính. Các yêu cầu về quy trình bổ sung có nghĩa là chúng tôi không thể làm như vậy trên thiết bị di động. Chúng tôi cũng nhận thấy rằng 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 vẫn có thể (mặc dù bất thường) rằng CSS/JS/hình ảnh hợp lệ tại các URL có thể đoán có thể chứa dữ liệu riêng tư.

Các công ty tiêu chuẩn web đã cùng nhau đưa ra giải pháp hoàn chỉnh hơn trên nhiều trình duyệt. Giải pháp này là để các trang có thể thông báo "Tôi từ đây từ bỏ khả năng đư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 tham gia". Việc khai báo này được thực hiện 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 đó, đổi lại, trang sẽ có quyền truy cập vào SharedArrayBuffer và các API khác có quyền truy cập tương tự. Các nguồn gốc khác có thể chọn nhúng nội dung qua Cross-Origin-Resource-Policy hoặc CORS.

Firefox là phiên bản đầu tiên cung cấp SharedArrayBuffer kèm theo 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ó. Chào bạn!

Và đó chính là nơi chúng tôi đang có mặt. Chrome 88 đưa SharedArrayBuffer trở lại Android cho các trang được tách biệt nhiều nguồn gốc, còn Chrome 92 cung cấp các yêu cầu tương tự cho máy tính, cả để đảm bảo tính nhất quán và sự tách biệt hoàn toàn giữa các nguồn gốc.

Trì hoãn quá trình thay đổi Chrome trên máy tính

Đây là một ngoại lệ tạm thời dưới dạng "bản dùng thử theo nguyên gốc" giúp mọi người có thêm thời gian để triển khai các trang được tách riêng trên nhiều nguồn gốc. Phương thức này bật SharedArrayBuffer mà không yêu cầu trang bị tách riêng 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 với Chrome dành cho 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 một thẻ origin-trial <meta> vào đầu mỗi trang. Ví dụ: URL này có thể có dạng như:
      <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
    • Nếu có thể định cấu hình máy chủ của mình, thì bạn cũng có thể thêm mã thông báo này bằng cách sử dụ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