Xây dựng sự thay thế cho uMatrix: Cách thức hoạt động trên Manifest V3
uMatrix từng là công cụ quyền lực để kiểm soát quyền truy cập tài nguyên của trình duyệt, nhưng đã bị khai tử. Bài viết này phân tích khả năng tái tạo các tính năng cốt lõi của uMatrix trên nền tảng Manifest V3 mới bằng cách tận dụng Content Security Policy và quy tắc khai báo.

Trước đây, cộng đồng người dùng Chrome từng có một tiện ích mở rộng tuyệt vời gọi là uMatrix, do Raymond Hill – cha đẻ của uBlock Origin – phát triển. uMatrix cung cấp một cách trực quan để kiểm soát quyền hạn của trang web và các yêu cầu tài nguyên phụ (subresource requests).
Đây không phải là công cụ dành cho đại chúng, nhưng đối với những người đam mê công nghệ, nó cho phép hạn chế các bên thứ ba phục vụ các yêu cầu tài nguyên, đồng thời kiểm soát quyền truy cập vào các tính năng như khung (frames), tập lệnh (scripts), video, phông chữ, v.v. Mặc dù bạn có thể thực hiện một phần việc này thông qua cài đặt thủ công của trình duyệt, nhưng uMatrix khiến quá trình này trở nên nhanh chóng và dễ dàng hơn rất nhiều.
Giao diện quen thuộc của uMatrix
Các tính năng của uMatrix về cơ bản là một tập con của các tính năng có sẵn trong uBlock Origin (uBO). Do đó, để giảm bớt gánh nặng bảo trì, Hill đã ngừng hỗ trợ uMatrix và khuyến khích người dùng chuyển sang uBO. Việc chuyển đổi này ban đầu diễn ra khá suôn sẻ, uBO thậm chí còn thêm vào các bộ lọc trang trí (cosmetic filters) mà nhiều người thích.
Tuy nhiên, tin buồn là uBO hiện là một tiện ích thuộc thế hệ cũ (Manifest V2 - MV2). Phiên bản kế nhiệm – uBO Lite – đã loại bỏ các tính năng chặn yêu cầu nâng cao này. Nhiều người dùng, bao gồm cả tác giả bài viết, không muốn từ bỏ khả năng kiểm soát chi tiết này. Vậy liệu có giải pháp nào không?
Ma trận quyền kiểm soát trong uMatrix
Thách thức của Manifest V3
Câu hỏi đặt ra là: Liệu uMatrix có thể hoạt động được dưới Manifest V3 (MV3) hay không? Sự khác biệt chính giữa MV2 và MV3 ở đây là bạn không còn khả năng chặn các yêu cầu trong khi thực thi một hàm callback (callback), hay còn gọi là "blocking web request".
Nếu bạn muốn chặn một yêu cầu, giờ đây việc đó phải được thực hiện theo cách khai báo (declaratively). Điều này có nghĩa là thay vì chạy một đoạn JavaScript trên từng yêu cầu đơn lẻ, bạn phải khai báo trước các hành động bạn muốn áp dụng.
Đây là điểm gây tranh cãi mà bạn có thể đã đọc được: Bạn không thể thực hiện mọi thứ có thể thực hiện trong một callback theo cách khai báo, vì vậy các khả năng đã bị giảm sút. Về mặt kỹ thuật điều này là đúng, nhưng trên thực tế, các quy tắc đủ linh hoạt cho hầu hết những gì chúng ta cần.
Giải pháp kỹ thuật: Sử dụng Content Security Policy
Web thực sự đã có một hệ thống để kiểm soát các tính năng và tài nguyên phụ, đó gọi là Content Security Policy (CSP).
Thiết kế rõ ràng ở đây là sử dụng declarativeNetRequest để thêm chính sách CSP của riêng mình, sau đó trình duyệt sẽ thực hiện tất cả công việc cho chúng ta. Tất cả những gì chúng ta cần làm là cung cấp một giao diện thuận tiện để quản lý nó.
Nhưng làm thế nào để cung cấp danh sách các tài nguyên phụ để cho phép hoặc từ chối? Khi bạn sử dụng uMatrix, nó sẽ hiển thị danh sách các loại tài nguyên và nguồn gốc (origins), cho phép bạn phê duyệt hoặc từ chối chúng thủ công. Đây là điểm cốt lõi khiến uMatrix làm tốt, nên nó là yếu tố bắt buộc.
Cấu trúc logic của tiện ích mới
Tác giả tin rằng CSP đã cung cấp sẵn giải pháp! Có một chỉ thị report-to hướng dẫn trình duyệt gửi mọi vi phạm bảo mật đến một điểm báo cáo (reporting endpoint).
Tất cả những gì chúng ta cần làm là bật tính năng đó, thêm một quy tắc declarativeNetRequest khác để bắt các báo cáo này, sau đó điền danh sách từ các báo cáo mà trình duyệt gửi đi. Đó là một nhiệm vụ khác được chuyển giao thành công cho trình duyệt 😂.
Kết quả và Bằng chứng khái niệm (PoC)
Dĩ nhiên, việc này sẽ cần một số công đoạn kỹ thuật (plumbing), nhưng các mảnh ghép đều đã có ở đó và dường như hoàn toàn khả thi. Bây giờ chúng ta đã có một phác thảo sơ bộ về cách nó có thể hoạt động... chỉ cần có người viết một bằng chứng khái niệm thôi.
Tác giả đã quyết định tự thử sức. Hiện tại nó rõ ràng đang ở trạng thái nguyên mẫu, nhưng về cơ bản nó đã hoạt động. Mã nguồn rất tối giản – không cần xây dựng hay phụ thuộc, chỉ cần git clone và sau đó chọn "Load Unpacked" trong Chrome.
Tác giả thừa nhận mình không phải là một nhà phát triển web và rõ ràng không có kỹ năng UX nào 🦎. Rất mong nhận được phản hồi nếu đây là một ý tưởng tồi, hoặc bạn biết giải pháp tốt hơn, hoặc bạn muốn đóng góp.
Bài viết liên quan

Phần mềm
Plugin Checkmarx Jenkins bị xâm phạm trong cuộc tấn công chuỗi cung ứng
11 tháng 5, 2026

Công nghệ
Substrate (YC S24) tuyển dụng Technical Success Manager cho nền tảng AI chuyên xử lý thanh toán y tế
13 tháng 5, 2026

Phần mềm
Bun công bố hướng dẫn chuyển đổi sang Rust, nhưng gọi dự án viết lại là "chưa chín muồi"
05 tháng 5, 2026
