Cải thiện tính bảo mật trong Manifest V3
Đây là phần cuối cùng trong số 3 phần mô tả những thay đổi cần thiết cho mã không thuộc trình chạy dịch vụ của tiện ích. Tài liệu này mô tả những thay đổi cần thiết để cải thiện tính bảo mật của các tiện ích. Hai phần còn lại đề cập đến việc cập nhật mã cần thiết để nâng cấp lên Manifest V3 và thay thế các yêu cầu chặn trên web.
Xoá việc thực thi các chuỗi tuỳ ý
Bạn không thể thực thi logic bên ngoài bằng cách sử dụng executeScript(), eval() và new Function() nữa.
- Di chuyển tất cả mã bên ngoài (JS, Wasm, CSS) vào gói tiện ích của bạn.
- Cập nhật tập lệnh và các tham chiếu về kiểu để tải tài nguyên từ gói tiện ích.
- Sử dụng
chrome.runtime.getURL()để tạo URL tài nguyên trong thời gian chạy. - Sử dụng iframe có thuộc tính hộp cát:
evalvànew Function(...)vẫn được hỗ trợ trong iframe có thuộc tính hộp cát. Để biết thêm thông tin, hãy đọc hướng dẫn về iframe được cách ly.
Phương thức executeScript() hiện nằm trong không gian tên scripting thay vì không gian tên tabs. Để biết thông tin về việc cập nhật lệnh gọi, hãy xem phần Di chuyển executeScript().
Vẫn có một số trường hợp đặc biệt mà bạn có thể thực thi các chuỗi tuỳ ý:
- Chèn biểu định kiểu được lưu trữ từ xa vào một trang web bằng insertCSS
- Đối với các tiện ích sử dụng
chrome.devtools: inspectWindow.eval cho phép thực thi JavaScript trong bối cảnh của trang được kiểm tra. - Các tiện ích gỡ lỗi có thể dùng chrome.debugger.sendCommand để thực thi JavaScript trong mục tiêu gỡ lỗi.
Xoá mã được lưu trữ từ xa
Trong Manifest V3, tất cả logic của tiện ích phải nằm trong gói tiện ích. Bạn không thể tải và thực thi các tệp được lưu trữ từ xa theo chính sách của Cửa hàng Chrome trực tuyến. Ví dụ:
- Các tệp JavaScript được lấy từ máy chủ của nhà phát triển.
- Mọi thư viện được lưu trữ trên CDN.
- Các thư viện của bên thứ ba đi kèm tự động tìm nạp mã được lưu trữ từ xa.
Có các phương pháp thay thế, tuỳ thuộc vào trường hợp sử dụng và lý do lưu trữ từ xa. Phần này mô tả các phương pháp cần cân nhắc. Nếu bạn gặp vấn đề khi xử lý mã được lưu trữ từ xa, chúng tôi có hướng dẫn dành cho bạn.
Các tính năng và logic dựa trên cấu hình
Tiện ích của bạn tải và lưu vào bộ nhớ đệm một cấu hình từ xa (ví dụ: tệp JSON) trong thời gian chạy. Cấu hình được lưu vào bộ nhớ đệm sẽ xác định những tính năng được bật.
Logic được tách biệt với một dịch vụ từ xa
Tiện ích của bạn gọi một dịch vụ web từ xa. Điều này giúp bạn giữ kín mã và thay đổi mã khi cần mà không phải chịu thêm gánh nặng khi gửi lại cho Cửa hàng Chrome trực tuyến.
Nhúng mã được lưu trữ từ xa trong iframe có thuộc tính hộp cát
Mã được lưu trữ từ xa được hỗ trợ trong iframe có thuộc tính hộp cát. Xin lưu ý rằng phương pháp này sẽ không hoạt động nếu mã yêu cầu quyền truy cập vào DOM của trang nhúng.
Gói các thư viện của bên thứ ba
Nếu đang sử dụng một khung phổ biến như React hoặc Bootstrap mà trước đây bạn đã tải từ một máy chủ bên ngoài, thì bạn có thể tải các tệp được rút gọn xuống, thêm các tệp đó vào dự án của mình và nhập chúng cục bộ. Ví dụ:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
Để đưa một thư viện vào một trình chạy dịch vụ, hãy đặt khoá "background.type" thành "module" trong tệp kê khai và sử dụng câu lệnh import.
Sử dụng thư viện bên ngoài trong tập lệnh được chèn vào thẻ
Bạn cũng có thể tải các thư viện bên ngoài trong thời gian chạy bằng cách thêm các thư viện đó vào mảng files khi gọi scripting.executeScript(). Bạn vẫn có thể tải dữ liệu từ xa trong thời gian chạy.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
Chèn một hàm
Nếu cần nhiều tính linh hoạt hơn, thuộc tính func mới trong scripting.executeScript() cho phép bạn chèn một hàm dưới dạng tập lệnh nội dung và truyền các biến bằng cách sử dụng thuộc tính args.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
Trong tệp tập lệnh nền.
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; chrome.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
Trong trình chạy dịch vụ nền.
Kho lưu trữ Chrome Extension Samples (Mẫu tiện ích của Chrome) chứa một ví dụ về việc chèn hàm mà bạn có thể thực hiện từng bước. Ví dụ về getCurrentTab() nằm trong tài liệu tham khảo cho hàm đó.
Tìm các giải pháp khác
Nếu các phương pháp trước đó không giúp ích cho trường hợp sử dụng của bạn, thì có thể bạn phải tìm một giải pháp thay thế (tức là di chuyển sang một thư viện khác) hoặc tìm những cách khác để sử dụng chức năng của thư viện. Ví dụ: trong trường hợp Google Analytics, bạn có thể chuyển sang giao thức đo lường của Google thay vì sử dụng phiên bản JavaScript được lưu trữ từ xa chính thức như mô tả trong hướng dẫn về Google Analytics 4.
Cập nhật chính sách bảo mật nội dung
"content_security_policy" chưa bị xoá khỏi tệp manifest.json, nhưng giờ đây, đây là một từ điển hỗ trợ 2 thuộc tính: "extension_pages" và "sandbox".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages: Đề cập đến các bối cảnh trong tiện ích, bao gồm cả tệp HTML và worker dịch vụ.
sandbox: Đề cập đến mọi trang tiện ích dạng hộp cát mà tiện ích của bạn sử dụng.
Xoá các chính sách bảo mật nội dung không được hỗ trợ
Manifest V3 không cho phép một số giá trị chính sách bảo mật nội dung trong trường "extension_pages" mà Manifest V2 cho phép. Cụ thể, Manifest V3 không cho phép những mã cho phép thực thi mã từ xa. Các chỉ thị script-src,, object-src và worker-src chỉ có thể có các giá trị sau:
selfnonewasm-unsafe-eval- Chỉ các tiện ích chưa đóng gói: mọi nguồn cục bộ (
http://localhost,http://127.0.0.1hoặc bất kỳ cổng nào trên các miền đó)
Giá trị chính sách bảo mật nội dung cho sandbox không có những hạn chế mới như vậy.