Cải thiện khả năng bảo mật trong tệp kê khai 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 đối với mã không thuộc trình chạy dịch vụ 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 trình bày về 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 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ập nhật các tệp tham chiếu tập lệnh 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ó hộp cát:
eval
vànew Function(...)
vẫn được hỗ trợ trong iframe có hộp cát. Để biết thêm thông tin, hãy đọc hướng dẫn về iframe trong 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 lệnh gọi, hãy xem phần Di chuyển executeScript()
.
Có một số trường hợp đặc biệt mà bạn vẫn có thể thực thi các chuỗi tuỳ ý:
- Chèn các tệp định kiểu được lưu trữ từ xa vào 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 ngữ cảnh của 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. Theo chính sách của Cửa hàng Chrome trực tuyến, bạn không thể tải và thực thi các tệp được lưu trữ từ xa nữa. 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.
Các tính năng và logic do cấu hình điều khiển
Tiện ích của bạn sẽ tải và lưu cấu hình từ xa (ví dụ: tệp JSON) vào bộ nhớ đệm trong thời gian chạy. Cấu hình được lưu vào bộ nhớ đệm xác định những tính năng được bật.
Logic được đưa ra bên ngoài bằng 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 cho phép bạn giữ mã ở chế độ riêng tư và thay đổi mã khi cần, đồng thời tránh được chi phí phát sinh 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 một iframe có thuộc tính hộp cát
Mã được 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 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 thư viện 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 đã rút gọn xuống, thêm các tệp đó vào dự án và nhập các tệp đó trên máy. 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 worker 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 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 hàm
Nếu cần thêm tính linh động, 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 Chrome chứa ví dụ về chèn hàm mà bạn có thể thực hiện từng bước. Ví dụ về getCurrentTab()
có trong tài liệu tham khảo 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, bạn có thể 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 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 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 ngữ cảnh trong tiện ích của bạn, bao gồm cả tệp html và worker dịch vụ.
sandbox
: Chỉ đế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 nhất định trong trường "extension_pages"
mà Manifest V2 cho phép. Cụ thể, Manifest V3 không cho phép những tệp đó cho phép thực thi mã từ xa. Chỉ thị 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 chưa được giải nén: mọi nguồn máy chủ cục bộ, (
http://localhost
,http://127.0.0.1
hoặc mọi cổng trên các miền đó)
Các giá trị chính sách bảo mật nội dung cho sandbox
không có các quy định hạn chế mới như vậy.