Zwiększanie bezpieczeństwa rozszerzeń

Zwiększanie bezpieczeństwa w przypadku platformy Manifest V3

To ostatnia z 3 sekcji opisujących zmiany, które należy wprowadzić w kodzie, który nie jest częścią skryptu service worker rozszerzenia. Opisuje zmiany wymagane do poprawy bezpieczeństwa rozszerzeń. W pozostałych 2 sekcjach znajdziesz informacje o aktualizacji kodu wymaganej do przejścia na platformę Manifest V3 i zastępowaniu blokujących żądań internetowych.

Usuwanie wykonywania dowolnych ciągów znaków

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

  • Przenieś cały kod zewnętrzny (JS, Wasm, CSS) do pakietu rozszerzenia.
  • Zaktualizuj odniesienia do skryptów i stylów, aby ładować zasoby z pakietu rozszerzenia.
  • Użyj browser.runtime.getURL(), aby tworzyć adresy URL zasobów w czasie działania programu.
  • Użyj elementu iframe w piaskownicy: atrybuty eval i new Function(...) są nadal obsługiwane w elementach iframe w piaskownicy. Więcej informacji znajdziesz w przewodniku po ramkach iframe 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 wykonanie dowolnych ciągów znaków jest nadal możliwe:

Usuwanie kodu hostowanego zdalnie

W przypadku platformy Manifest V3 cała logika rozszerzenia musi być częścią pakietu rozszerzenia. Nie możesz już wczytywać i wykonywać plików hostowanych zdalnie zgodnie z zasadami Chrome Web Store. Przykłady:

  • Pliki JavaScript pobrane z serwera dewelopera.
  • Każda biblioteka hostowana w CDN.
  • dołączone biblioteki innych firm, które dynamicznie pobierają kod hostowany zdalnie;

Dostępne są alternatywne podejścia, w zależności od przypadku użycia i przyczyny zdalnego hostowania. W tej sekcji opisujemy podejścia, które warto rozważyć. Jeśli masz problemy z kodem hostowanym zdalnie, zapoznaj się z naszymi wskazówkami.

Funkcje i logika oparte na konfiguracji

Rozszerzenie wczytuje i buforuje zdalną konfigurację (np. plik JSON) w czasie działania. Konfiguracja zapisana w pamięci podręcznej określa, które funkcje są włączone.

Zewnętrzna logika z usługą zdalną

Rozszerzenie wywołuje zdalną usługę sieciową. Dzięki temu możesz zachować kod prywatny i w razie potrzeby go zmieniać, unikając dodatkowego narzutu związanego z ponownym przesyłaniem do Chrome Web Store.

Umieszczanie kodu hostowanego zdalnie w elemencie iframe umieszczonym w piaskownicy

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

Pakowanie bibliotek innych firm

Jeśli używasz popularnego frameworka, takiego jak React lub Bootstrap, który wcześniej był wczytywany z zewnętrznego serwera, 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" w pliku manifestu na "module" i użyj instrukcji import.

Używanie bibliotek zewnętrznych w skryptach wstrzykiwanych na kartach

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

browser.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 scripting.executeScript() umożliwia wstrzyknięcie funkcji jako skryptu treści i przekazywanie zmiennych za pomocą właściwości args.

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

W pliku skryptu działającego w tle.

(platforma) Manifest V3
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

function showAlert(givenName) {
  alert(`Hello, ${givenName}`);
}

let name = 'World';
browser.scripting.executeScript({
  target: {tabId: tab.id},
  func: showAlert,
  args: [name],
});

W tle działa service worker.

W repozytorium przykładów rozszerzeń do Chrome znajdziesz przykład wstrzykiwania funkcji, który możesz prześledzić krok po kroku. Przykład getCurrentTab() znajdziesz w dokumentacji tej funkcji.

Poszukaj innych rozwiązań

Jeśli poprzednie podejścia nie pomogą w Twoim przypadku, być może będziesz musiał(-a) znaleźć rozwiązanie alternatywne (np. przejść na inną bibliotekę) lub inne sposoby korzystania z funkcji biblioteki. W przypadku Google Analytics możesz na przykład 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

Element "content_security_policy" nie został usunięty z pliku manifest.json, ale jest teraz słownikiem obsługującym 2 właściwości: "extension_pages" i "sandbox".

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

extension_pages: odnosi się do kontekstów w rozszerzeniu, w tym plików HTML i procesów roboczych usługi.

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

Usuwanie nieobsługiwanych zasad zabezpieczeń treści

Platforma Manifest V3 nie zezwala na niektóre wartości zasad bezpieczeństwa treści w polu "extension_pages", które były dozwolone w przypadku platformy Manifest V2. W szczególności Manifest V3 nie zezwala na te, które umożliwiają zdalne wykonywanie kodu. Dyrektywy script-src,, object-src i worker-src mogą mieć tylko te wartości:

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

Wartości zasady bezpieczeństwa treści dla elementu sandbox nie podlegają takim nowym ograniczeniom.