Zwiększanie bezpieczeństwa rozszerzeń

Poprawianie bezpieczeństwa w Manifest V3

To ostatnia z 3 sekcji opisujących zmiany wymagane w kodzie, który nie jest częścią rozszerzenia usługi. Dowiesz się z niego, jakie zmiany należy wprowadzić, by zwiększyć bezpieczeństwo rozszerzeń. Pozostałe 2 sekcje dotyczą aktualizacji kodu, który jest potrzebny do przejścia na Manifest V3, oraz zastępowania blokujących żądań sieciowych.

Usuwanie wykonywania dowolnych ciągów znaków

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

  • Przenieś cały kod zewnętrzny (JS, Wasm, CSS) do pakietu rozszerzeń.
  • Zaktualizuj odwołania do skryptu i stylów, aby wczytywać zasoby z pakietu rozszerzenia.
  • Używaj narzędzia chrome.runtime.getURL(), aby tworzyć adresy URL zasobów w czasie działania.
  • Użyj iframe w piaskownicy: eval i new Function(...) są nadal obsługiwane w elementach iframe w piaskownicy. Więcej informacji znajdziesz w przewodniku na temat ramek iframe w piaskownicy.

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

W pewnych szczególnych przypadkach zastosowanie 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 rozszerzeń. Zgodnie z zasadami Chrome Web Store nie można już ładować i uruchamiać plików hostowanych zdalnie. Przykłady:

  • pliki JavaScript pobierane z serwera dewelopera;
  • każda biblioteka hostowana w CDN;
  • Biblioteki innych firm w pakiecie, które dynamicznie pobierają kod hostowany zdalnie.

Dostępne są różne podejścia w zależności od konkretnego przypadku użycia i powodu hostowania zdalnego. W tej sekcji opisano metody, które warto wziąć pod uwagę. Jeśli masz problemy z kodem hostowanym zdalnie, skorzystaj z wskazówek.

Funkcje i logika oparta na konfiguracji

Rozszerzenie wczytuje i przechowuje w pamięci podręcznej konfigurację zdalną (np. plik JSON) w czasie działania. Konfiguracja w pamięci podręcznej 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 kod pozostaje prywatny i można go w razie potrzeby zmieniać bez konieczności ponownego przesyłania do Chrome Web Store.

Umieszczenie kodu hostowanego zdalnie w elemencie iframe umieszczonym w piaskownicy

Kod hostowany zdalnie jest obsługiwany w elementach iframe umieszczonych w piaskownicy. Pamiętaj, że ta metoda nie zadziała, jeśli kod wymaga dostępu do DOM strony, na której jest umieszczony.

Pakiety bibliotek innych firm

Jeśli używasz popularnego frameworka, takiego jak React czy Bootstrap, który wcześniej wczytywałeś z zewnętrznego serwera, możesz pobrać zminiaturyzowane pliki, dodać je do projektu i zaimportować je lokalnie. Na przykład:

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

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

Używanie bibliotek zewnętrznych w skryptach wstawianych za pomocą tabulacji

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

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

Wstawianie funkcji

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

(platforma) Manifest V2
let name = 'World!';
chrome.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';
chrome.scripting.executeScript({
  target: {tabId: tab.id},
  func: showAlert,
  args: [name],
});

Skrypt service worker w tle.

Repozytorium Chrome Extension Samples zawiera przykład wstrzyknięcia funkcji, który możesz przejrzeć krok po kroku. Przykład getCurrentTab() znajduje się w odwołaniu tej funkcji.

Szukanie innych sposobów obejścia problemu

Jeśli poprzednie rozwiązania nie pomogą w Twoim przypadku użycia, być może musisz znaleźć alternatywne rozwiązanie (np. przenieść się do innej biblioteki) lub poszukać innych sposobów na wykorzystanie funkcji biblioteki. Na przykład w przypadku Google Analytics możesz przejść na platformę Google Measurement Protocol, zamiast korzystać z oficjalnej, hostowanej zdalnie wersji JavaScriptu zgodnie z opisem w przewodniku Google Analytics 4.

Aktualizowanie polityki bezpieczeństwa treści

Pozycja "content_security_policy" nie została usunięta 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 skryptów service worker.

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

Usuwanie nieobsługiwanych zasad zabezpieczeń treści

Manifest V3 nie zezwala na niektóre wartości zasad bezpieczeństwa treści w polu "extension_pages", które były dozwolone w manifeście V2. W szczególności Manifest V3 nie zezwala na te, które umożliwiają zdalne wykonywanie kodu. Polecenia script-src,, object-srcworker-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 zasad bezpieczeństwa treści w przypadku sandbox nie mają takich nowych ograniczeń.