Cải thiện khả năng bảo mật trong Manifest V3
Đây là phần cuối cùng trong ba phần mô tả những thay đổi cần thiết đối với mã không phải là một phần của trình chạy dịch vụ tiện ích. Tài liệu này mô tả những thay đổi cần thực hiện để cải thiện khả năng bảo mật của 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ế việc chặn các yêu cầu 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 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 các tham chiếu kiểu và tập lệnh để 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ó hộp cát:
eval
vànew Function(...)
vẫn được hỗ trợ trong iframe hộp cát. Để biết thêm chi tiết, hãy đọc hướng dẫn về iframe hộp cát.
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ề cách cập nhật cuộc gọi, hãy xem phần Di chuyển executeScript()
.
Có một số trường hợp đặc biệt vẫ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 trang được kiểm tra. - Tiện ích trình gỡ lỗi có thể sử dụng chrome.debugger.sendCommand để thực thi JavaScript trong một 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 còn có 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ụ:
- Tệp JavaScript được lấy từ máy chủ của nhà phát triển.
- Bất kỳ thư viện nào được lưu trữ trên CDN.
- Các thư viện dạng gói của bên thứ ba 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 của bạn 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.
Logic và tính năng dựa trên cấu hình
Tiện ích của bạn tải và lưu một cấu hình từ xa vào bộ nhớ đệm (ví dụ: tệp JSON) trong thời gian chạy. Cấu hình được lưu vào bộ nhớ đệm xác định tính năng nào được bật.
Logic ra bên ngoài với 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 cho phép bạn bảo mật mã và thay đổi mã khi cần mà không phải tốn thêm chi phí gửi lại đến 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ã lưu trữ từ xa được hỗ trợ trong iframe hộp cát. Xin lưu ý rằng phương pháp này không hiệu quả nếu mã yêu cầu quyền truy cập vào DOM của trang nhúng.
Đóng gói 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 đó bạn đã tải qua một máy chủ bên ngoài, thì bạn có thể tải các tệp đã giảm kích thước xuống, thêm chúng vào dự án 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 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 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 bạn cần nhiều động 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 thuộc tính args
.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
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], });
Kho lưu trữ mẫu tiện ích của Chrome chứa ví dụ về nội dung chèn hàm mà bạn có thể xem hướng dẫn từng bước. Ví dụ về getCurrentTab()
có trong tệp tham chiếu cho hàm đó.
Tìm 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ì bạn có thể phải tìm một giải pháp thay thế (tức là chuyển sang một thư viện khác) hoặc tìm cách khác để sử dụng chức năng của thư viện đó. Ví dụ: trong trường hợp của Google Analytics, bạn có thể chuyển sang Measurement Protocol của Google thay vì sử dụng phiên bản JavaScript chính thức được lưu trữ từ xa 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 hiện là một từ điển hỗ trợ hai 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
: Tham chiếu đến các ngữ cảnh trong tiện ích của bạn, bao gồm cả tệp html và trình chạy dịch vụ.
sandbox
: Tham chiếu đến mọi trang tiện ích trong 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 nhất định trong trường "extension_pages"
được cho phép trong Manifest V2. Cụ thể, Manifest V3 không cho phép những thao tác cho phép thực thi mã từ xa. Lệnh script-src,
object-src
và worker-src
chỉ có thể có các giá trị sau:
self
none
wasm-unsafe-eval
- Chỉ các tiện ích đã giải nén: mọi nguồn localhost, (
http://localhost
,http://127.0.0.1
hoặc bất kỳ cổng nào trên các miền đó)
Không có quy định hạn chế mới nào như vậy trong chính sách bảo mật nội dung cho sandbox
.