Zwiększanie bezpieczeństwa rozszerzeń

Zwiększanie bezpieczeństwa w platformie Manifest V3

To ostatnia z 3 sekcji opisujących zmiany wymagane w przypadku kodu, który nie jest częścią skryptu service worker rozszerzenia. Opisuje ona zmiany wymagane w celu zwiększenia bezpieczeństwa rozszerzeń. Pozostałe 2 sekcje dotyczą aktualizowania kodu potrzebnego do przejścia na platformę Manifest V3 i zastępowania blokujących żądań internetowych.

Usuwanie wykonywania dowolnych ciągów znaków

Nie możesz już wykonywać logiki zewnętrznej za pomocą executeScript(), eval(), i new Function().

  • Przenieś cały kod zewnętrzny (JS, Wasm, CSS) do pakietu rozszerzenia.
  • Zaktualizuj odwołania do skryptów i stylów, aby ładować zasoby z pakietu rozszerzenia.
  • Użyj chrome.runtime.getURL(), aby tworzyć adresy URL zasobów w czasie działania.
  • Użyj elementu iframe umieszczonego w piaskownicy: funkcje eval i new Function(...) są nadal obsługiwane w elementach iframe umieszczonych w piaskownicy. Więcej informacji znajdziesz w przewodniku po elementach iframe umieszczonych w piaskownicy.

Metoda executeScript() znajduje się teraz w przestrzeni nazw scripting, a nie w przestrzeni nazw tabs. Informacje o aktualizowaniu wywołań znajdziesz w artykule Przenoszenie executeScript().

Istnieje kilka szczególnych przypadków, w których wykonywanie dowolnych ciągów znaków jest nadal możliwe:

Usuwanie kodu hostowanego zdalnie

W platformie Manifest V3 cała logika rozszerzenia musi być częścią pakietu rozszerzenia. Zgodnie z zasadami Chrome Web Store nie możesz już ładować ani wykonywać plików hostowanych zdalnie. Przykłady:

  • Pliki JavaScript pobierane z serwera dewelopera.
  • Dowolna biblioteka hostowana w CDN.
  • Biblioteki zewnętrzne w pakiecie, które dynamicznie pobierają kod hostowany zdalnie.

W zależności od przypadku użycia i przyczyny hostowania zdalnego dostępne są alternatywne rozwiązania. W tej sekcji opisujemy rozwiązania, które warto rozważyć. Jeśli masz problemy z kodem hostowanym zdalnie, mamy dla Ciebie wskazówki.

Funkcje i logika oparte na konfiguracji

Rozszerzenie w czasie działania ładuje i buforuje konfigurację zdalną (np. plik JSON). Zbuforowana konfiguracja określa, które funkcje są włączone.

Logika zewnętrzna z usługą zdalną

Rozszerzenie wywołuje zdalną usługę sieciową. Dzięki temu możesz zachować prywatność kodu i w razie potrzeby go zmieniać, unikając dodatkowych kosztów związanych z ponownym przesyłaniem do Chrome Web Store.

Osadzanie kodu hostowanego zdalnie w elemencie iframe umieszczonym w piaskownicy

Kod hostowany zdalnie jest obsługiwany w elementach iframe umieszczonych w piaskownicy. Pamiętaj, że to rozwiązanie nie działa, jeśli kod wymaga dostępu do DOM strony osadzającej.

Pakiet bibliotek zewnętrznych

Jeśli używasz popularnej platformy, takiej jak React czy Bootstrap, która wcześniej była ładowana z serwera zewnętrznego, możesz pobrać zminimalizowane pliki, dodać je do projektu i zaimportować lokalnie. Na przykład:

<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">

Aby uwzględnić bibliotekę w skrypcie service worker, ustaw klucz "background.type" na "module" w pliku manifestu i użyj instrukcji import.

Używanie bibliotek zewnętrznych w skryptach wstrzykiwanych do kart

Możesz też ładować biblioteki zewnętrzne w czasie działania, dodając je do tablicy files podczas wywoływania funkcji scripting.executeScript(). Dane możesz nadal ładować zdalnie w czasie działania.

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

Wstrzykiwanie funkcji

Jeśli potrzebujesz większej dynamiki, nowa właściwość func w funkcji scripting.executeScript() umożliwia wstrzykiwanie funkcji jako skryptu treści i przekazywanie zmiennych za pomocą właściwości args.

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

W pliku skryptu w tle.

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],
});

W skrypcie service worker w tle.

W repozytorium próbek rozszerzeń Chrome znajdziesz przykład wstrzykiwania funkcji, który możesz prześledzić. Przykład użycia funkcji getCurrentTab() znajdziesz w dokumentacji referencyjnej tej funkcji.

Szukanie innych obejść

Jeśli poprzednie rozwiązania nie pomogą w Twoim przypadku użycia, być może będziesz musiał znaleźć rozwiązanie alternatywne (np. przejść na inną bibliotekę) lub znaleźć inne sposoby korzystania z funkcji biblioteki. Na przykład w przypadku Google Analytics możesz przejść na protokół pomiarowy Google zamiast używać oficjalnej wersji JavaScript hostowanej zdalnie, jak opisano w naszym przewodniku po Google Analytics 4.

Aktualizowanie standardu Content Security Policy

Właściwość "content_security_policy" nie została usunięta z pliku manifest.json, ale jest teraz słownikiem, który obsługuje 2 właściwości: "extension_pages" i "sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: odnosi się do kontekstów w rozszerzeniu, w tym do plików HTML i service workerów.

sandbox: odnosi się do wszystkich stron rozszerzenia umieszczonych w piaskownicy, których używa rozszerzenie.

Usuwanie nieobsługiwanych standardów Content Security Policy

Platforma Manifest V3 nie zezwala na używanie niektórych wartości standardu Content Security Policy w polu "extension_pages", które były dozwolone w platformie Manifest V2. W szczególności platforma Manifest V3 nie zezwala na te, które umożliwiają wykonywanie kodu zdalnego. Dyrektywy script-src, object-src i worker-src mogą mieć tylko te wartości:

  • self
  • none
  • wasm-unsafe-eval
  • Tylko w przypadku rozszerzeń rozpakowanych: dowolne źródło localhost (http://localhost, http://127.0.0.1, lub dowolny port w tych domenach).

Wartości standardu Content Security Policy dla właściwości sandbox nie mają takich nowych ograniczeń.