Vách ngăn không gian lưu trữ

Để tăng cường quyền riêng tư của người dùng và chống lại hoạt động theo dõi trên nhiều trang web cho kênh phụ, Chrome hiện tách biệt hầu hết các API bộ nhớ và giao tiếp trong ngữ cảnh của bên thứ ba thông qua một quy trình gọi là phân vùng bộ nhớ.

Trạng thái triển khai

Tính năng này đã được bật cho tất cả người dùng trên Chrome 115 trở lên. Các nỗ lực phân vùng bộ nhớ tương tự cũng đang được triển khai hoặc lên kế hoạch trong các trình duyệt lớn khác như Firefox và Safari. Đề xuất phân vùng bộ nhớ trên GitHub đang mở để thảo luận thêm.

Phân vùng bộ nhớ là gì?

Để ngăn chặn một số loại hình theo dõi trên nhiều trang web cho kênh phụ, Chrome phân vùng bộ nhớ và các API giao tiếp trong bối cảnh của bên thứ ba.

Nếu không có tính năng phân vùng bộ nhớ, một trang web có thể kết hợp dữ liệu trên nhiều trang web để theo dõi người dùng trên web. Ngoài ra, tính năng này cho phép trang web được nhúng suy luận các trạng thái cụ thể về người dùng trong trang web cấp cao nhất bằng cách sử dụng các kỹ thuật kênh bên như Tấn công theo thời gian, XS-LeaksCOSI.

Trước đây, bộ nhớ chỉ được khoá theo nguồn gốc. Điều này có nghĩa là nếu một iframe từ example.com được nhúng trên a.comb.com, thì iframe đó có thể tìm hiểu về thói quen duyệt web của bạn trên hai trang web đó bằng cách lưu trữ và truy xuất thành công mã nhận dạng từ bộ nhớ. Khi bạn bật tính năng phân vùng bộ nhớ của bên thứ ba, bộ nhớ cho example.com sẽ tồn tại trong hai phân vùng khác nhau, một phân vùng cho a.com và phân vùng còn lại cho b.com.

Nhìn chung, việc phân vùng có nghĩa là tất cả ngữ cảnh có cùng nguồn gốc không thể truy cập vào dữ liệu do các API bộ nhớ (chẳng hạn như Bộ nhớ cục bộ và IndexedDB) ghi trong một iframe nữa. Thay vào đó, dữ liệu đó hiện được tách biệt và chỉ có sẵn cho các ngữ cảnh có cùng nguồn gốc và cùng trang web cấp cao nhất.

Trước

API bộ nhớ không phân vùng.
Trước khi phân vùng bộ nhớ, example.com có thể ghi dữ liệu khi được nhúng trên a.com, sau đó đọc dữ liệu đó khi được nhúng trên b.com.

Sau

API bộ nhớ có phân vùng.
Sau khi phân vùng bộ nhớ, example.com, khi được nhúng trong b.com, không thể truy cập vào bộ nhớ của example.com khi được nhúng trong a.com.

Phân vùng bộ nhớ trên các iframe được nối

Mức độ phức tạp của việc phân vùng bộ nhớ tăng lên đáng kể khi các iframe được lồng, đặc biệt là khi cùng một nguồn gốc xuất hiện nhiều lần trong chuỗi.

Ví dụ: A1 chứa một iframe cho B, trong đó chứa một iframe cho A2 và cả A1 và A2 đều nằm trên cùng một trang web. Nếu việc phân vùng chỉ xem xét trang web cấp cao nhất và nguồn gốc của khung hiện tại, thì iframe A2 có thể bị nhầm là "bên thứ nhất" vì nó dùng chung một trang web với cấp cao nhất (A1), mặc dù có iframe B trên nhiều trang web ở giữa. Điều này có thể khiến A2 gặp phải các rủi ro bảo mật như nhấp chuột giả mạo nếu A2 có quyền truy cập vào bộ nhớ chưa phân vùng theo mặc định.

Để giải quyết vấn đề này, Chrome thêm một "bit gốc" vào khoá phân vùng bộ nhớ. Bit này được đặt nếu bất kỳ tài liệu nào giữa iframe hiện tại và trang web cấp cao nhất đều có nguồn gốc khác (trên nhiều trang web). Trong trường hợp này, Trang web B là trang web đa trang nên bit sẽ được đặt cho A2 và bộ nhớ của trang web này sẽ được phân vùng từ A1.

Khi chuỗi iframe chỉ bao gồm các ngữ cảnh trên cùng một trang web (ví dụ: Trang web A1 chứa A2, sau đó chứa A3), bit gốc sẽ không phân vùng thêm bộ nhớ của các trang web đó. Trong những trường hợp như vậy, bộ nhớ của các ứng dụng này vẫn được chia sẻ, được khoá bằng nguồn gốc chung và trang web cấp cao nhất.

Đối với những trang web cần quyền truy cập không phân vùng trên các iframe theo chuỗi, Chrome đang thử nghiệm việc mở rộng Storage Access API để hỗ trợ trường hợp sử dụng này. Vì Storage Access API yêu cầu trang web được đóng khung phải gọi API một cách rõ ràng, nên điều này sẽ giảm thiểu rủi ro nhấp chuột giả mạo.

Các thay đổi về API do phân vùng

Các API chịu ảnh hưởng của việc phân vùng có thể được chia thành các nhóm sau:

API bộ nhớ

  • Hệ thống hạn mức
    Hệ thống hạn mức được dùng để xác định dung lượng ổ đĩa được phân bổ cho bộ nhớ. Hệ thống hạn mức quản lý từng phân vùng dưới dạng một bộ chứa riêng biệt để xác định dung lượng được phép và thời điểm xoá bộ chứa đó.
    Phương thức navigator.storage.estimate() hiện cung cấp thông tin dành riêng cho phân vùng bộ nhớ. Các API chỉ dành cho Chrome như window.webkitStorageInfonavigator.webkitTemporaryStorage không còn được dùng nữa.
    IndexedDBBộ nhớ đệm sử dụng hệ thống hạn mức được phân vùng.
  • Web Storage API
    Web Storage API cung cấp các cơ chế để trình duyệt có thể lưu trữ các cặp khoá-giá trị. Có hai cơ chế: Bộ nhớ cục bộBộ nhớ phiên. Các vùng chứa này không được quản lý theo hạn mức nhưng vẫn được phân vùng.
  • Hệ thống tệp riêng tư của Origin
    API Truy cập hệ thống tệp cho phép một trang web đọc hoặc lưu trực tiếp các thay đổi vào tệp và thư mục trên thiết bị sau khi người dùng cấp quyền truy cập. Hệ thống tệp riêng tư của nguồn cho phép nguồn lưu trữ nội dung riêng tư trực tiếp vào ổ đĩa. Người dùng vẫn có thể truy cập vào nội dung này nhưng nội dung này hiện đã được phân vùng.
  • Storage Bucket API
    API Bộ nhớ đang được phát triển cho Storage Standard (Tiêu chuẩn bộ nhớ). API này hợp nhất nhiều API bộ nhớ như IndexedDB và localStorage bằng cách sử dụng một khái niệm mới có tên là bộ chứa. Dữ liệu được lưu trữ trong các bộ chứa và siêu dữ liệu liên kết với các bộ chứa được phân vùng.
  • Tiêu đề Clear-Site-Data
    Việc đưa tiêu đề Clear-Site-Data vào phản hồi cho phép máy chủ yêu cầu xoá dữ liệu được lưu trữ trong trình duyệt của người dùng. Bạn có thể xoá bộ nhớ đệm, cookie và bộ nhớ DOM. Việc sử dụng tiêu đề chỉ xoá bộ nhớ trong một phân vùng.
  • Kho URL blob
    URL Blob cung cấp quyền truy cập vào blob, một đối tượng lưu giữ dữ liệu thô. Nếu không phân vùng bộ nhớ, URL blob được tạo trong một iframe của bên thứ ba trên một trang web có thể được sử dụng trong một iframe cùng nguồn gốc được nhúng trong một trang web khác. Ví dụ: nếu các iframe example.com được nhúng trên cả a.comb.com, thì URL blob được tạo trong iframe được nhúng trên a.com có thể được truyền đến và sau đó được iframe được nhúng trên b.com sử dụng mà không có bất kỳ hạn chế nào. Kể từ Chrome 137 (phát hành ngày 27 tháng 5 năm 2025), URL Blob được phân vùng cho mọi mục đích sử dụng ngoại trừ thao tác điều hướng cấp cao nhất. Các trường hợp hiện sẽ bị chặn bao gồm khi URL blob trên nhiều phân vùng được sử dụng với fetch() hoặc làm giá trị thuộc tính src cho nhiều phần tử HTML. Các thao tác điều hướng cấp cao nhất, chẳng hạn như gọi window.open() hoặc nhấp vào một đường liên kết bằng target='_blank', đến URL Blob sẽ không bị chặn nếu các thao tác đó là trên nhiều phân vùng, nhưng noopener sẽ được thực thi nếu trang web URL blob là trên nhiều trang web so với trang web cấp cao nhất của trang đã khởi tạo thao tác điều hướng. Việc thực thi noopener có nghĩa là tài liệu bắt đầu thao tác điều hướng sẽ không được lấy tay cầm cửa sổ cho tài liệu URL blob mà tài liệu đó đã mở. Trong ví dụ trước, việc phân vùng sẽ ngăn khung iframe trên b.com tìm nạp nội dung của URL blob, nhưng khung này vẫn có thể window.open() nội dung đó.

API giao tiếp

Cùng với các API bộ nhớ, các API giao tiếp cho phép một ngữ cảnh giao tiếp qua các ranh giới gốc cũng được phân vùng. Những thay đổi này chủ yếu ảnh hưởng đến các API cho phép khám phá các ngữ cảnh khác bằng cách truyền tin hoặc gặp gỡ cùng nguồn gốc.

Do việc phân vùng, các API giao tiếp sau đây ngăn iframe của bên thứ ba trao đổi dữ liệu với ngữ cảnh cùng nguồn gốc:

  • Kênh truyền tin
    Broadcast Channel API cho phép giao tiếp giữa ngữ cảnh duyệt web (cửa sổ, thẻ hoặc iframe) và worker có cùng nguồn gốc.
    Không đề xuất thay đổi hành vi của iframe trên nhiều trang web postMessage(), vì mối quan hệ giữa các ngữ cảnh đó đã được xác định rõ ràng.
  • SharedWorker
    SharedWorker API cung cấp một worker có thể truy cập được trên các ngữ cảnh duyệt web có cùng nguồn gốc.
  • Khoá web
    Web Locks API cho phép mã chạy trong một thẻ hoặc trình chạy của cùng một nguồn gốc để lấy khoá cho một tài nguyên dùng chung trong khi thực hiện một số công việc.

API Trình chạy dịch vụ

Service Worker API cho phép các trang web thực hiện các tác vụ ở chế độ nền. Các trang web đăng ký trình chạy dịch vụ tạo ngữ cảnh trình chạy mới để phản hồi các sự kiện. Theo truyền thống, các worker này có thể giao tiếp với bất kỳ ngữ cảnh cùng nguồn gốc nào. Tuy nhiên, vì worker dịch vụ có thể thay đổi thời gian của các yêu cầu điều hướng, nên chúng có nguy cơ rò rỉ thông tin trên nhiều trang web như quét nhật ký.

Vì lý do này, các Trình chạy dịch vụ được đăng ký từ ngữ cảnh của bên thứ ba hiện đã được phân vùng.

API tiện ích

Tiện ích là các chương trình cho phép người dùng tuỳ chỉnh trải nghiệm duyệt web của họ.

Bạn có thể nhúng các trang tiện ích (trang có giao thức chrome-extension://) trên các trang web trên web. Trong trường hợp này, các trang tiện ích vẫn có quyền truy cập vào phân vùng cấp cao nhất của chúng. Tiện ích cũng có thể nhúng các trang web khác; khi đó, các trang web được nhúng đó sẽ truy cập vào phân vùng cấp cao nhất, miễn là tiện ích có quyền lưu trữ cho các trang web đó.

Để biết thêm thông tin, hãy xem tài liệu về tiện ích.

Bản minh hoạ: kiểm thử tính năng phân vùng bộ nhớ

Trang web minh hoạ: https://storage-partitioning-demo-site-a.glitch.me/

Trang web minh hoạ cho thấy dấu kiểm màu xanh lục ở bên trái và dấu thập màu đỏ ở bên phải.
Ảnh chụp màn hình minh hoạ, cho thấy kết quả cho một trình duyệt có phân vùng bộ nhớ ở bên trái và không có phân vùng bộ nhớ ở bên phải.

Bản minh hoạ sử dụng hai trang web: trang web A và trang web B.

  • Khi bạn truy cập vào trang web A trong ngữ cảnh cấp cao nhất, trang web này sẽ đặt dữ liệu bằng nhiều phương thức lưu trữ.
  • Trang web B nhúng một trang từ trang web A và trang nhúng đó cố gắng đọc các tuỳ chọn bộ nhớ đã đặt trước đó.
  • Khi trang web A được nhúng trên trang web B, trang web A sẽ không có quyền truy cập vào dữ liệu đó khi bộ nhớ được phân vùng và do đó, các lượt đọc sẽ không thành công.
  • Bản minh hoạ sử dụng trạng thái thành công hoặc không thành công của mỗi lần đọc để cho biết dữ liệu có được phân vùng hay không.

Hiện tại, bạn có thể tắt tính năng phân vùng bộ nhớ trong Chrome bằng cách sử dụng công tắc dòng lệnh --disable-features=ThirdPartyStoragePartitioning. Lưu ý: Nút chuyển dòng lệnh này dành cho mục đích phát triển và kiểm thử, đồng thời có thể bị xoá hoặc thay đổi trong các phiên bản Chrome sau này.

Bạn cũng có thể kiểm thử các trình duyệt khác theo cách tương tự để xem trạng thái phân vùng của các trình duyệt đó.

Tương tác và chia sẻ ý kiến phản hồi