Cải thiện tính bảo mật của tiện ích

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()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: evalnew 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ỳ ý:

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.

Manifest V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

Trong tệp tập lệnh nền.

Manifest V3
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ụ ở chế độ nền.

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""sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "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-srcworker-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.