Zwiększanie bezpieczeństwa rozszerzeń

Poprawa bezpieczeństwa na platformie Manifest V3

To jest ostatnia z 3 sekcji opisujących zmiany niezbędne w kodzie, który nie jest częścią skryptu service worker rozszerzenia. Opisano w nim zmiany niezbędne do zwiększenia bezpieczeństwa rozszerzeń. W pozostałych 2 sekcjach opisano aktualizację kodu niezbędnego do uaktualnienia do platformy Manifest V3 oraz zastępowanie blokowania żądań internetowych.

Usuń wykonanie dowolnych ciągów znaków

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

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

Metoda executeScript() jest teraz w przestrzeni nazw scripting, a nie w przestrzeni nazw tabs. Informacje o aktualizowaniu połączeń 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 platformie Manifest V3 wszystkie funkcje logiczne rozszerzenia muszą być częścią pakietu rozszerzeń. Zgodnie z zasadami Chrome Web Store nie można już ładować i uruchamiać zdalnie plików hostowanych. Przykłady:

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

Dostępne są alternatywne podejścia zależne od przypadku użycia i przyczyny hostingu zdalnego. W tej sekcji opisujemy, co warto wziąć pod uwagę. Jeśli masz problemy z używaniem kodu hostowanego zdalnie, zapoznaj się z naszymi wskazówkami.

Funkcje i logika oparta na konfiguracji

Rozszerzenie wczytuje zdalną konfigurację (na przykład plik JSON) i zapisuje ją w pamięci podręcznej w czasie działania. Konfiguracja z pamięci podręcznej określa, które funkcje są włączone.

Logika działająca z zewnątrz przy pomocy usługi zdalnej

Rozszerzenie wywołuje zdalną usługę internetową. Dzięki temu zachowujesz prywatność kodu i w razie potrzeby wprowadzasz w nim zmiany, a jednocześnie unikasz dodatkowego nakładu pracy związanego z ponownym przesyłaniem go do Chrome Web Store.

Umieść kod hostowany zdalnie w elemencie iframe w trybie piaskownicy

Kod hostowany zdalnie jest obsługiwany w elementach iframe w trybie piaskownicy. Uwaga: ta metoda nie działa, jeśli kod wymaga dostępu do DOM strony, na której umieszczono daną stronę.

Łączenie bibliotek innych firm

Jeśli używasz popularnej platformy (np. React lub Bootstrap), która była wcześniej wczytywana z serwera zewnętrznego, możesz pobrać zmniejszone 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 dołączyć bibliotekę do skryptu service worker, ustaw klucz "background.type" w pliku manifestu na "module" i użyj instrukcji import.

Używanie bibliotek zewnętrznych w skryptach wstrzykiwanych tabulatorami

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

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

Wstrzyknij funkcję

Jeśli potrzebujesz więcej 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!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

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

w skrypcie usługi w tle,

Repozytorium Chrome Extension Samples zawiera przykład wstrzykiwania funkcji, z którym możesz skorzystać. Przykład getCurrentTab() znajdziesz w odwołaniu do tej funkcji.

Inne sposoby obejścia tego problemu

Jeśli poprzednie metody nie pomogły w Twoim przypadku użycia, konieczne może być znalezienie innego rozwiązania (np. migrację do innej biblioteki) lub skorzystanie z innych sposobów korzystania z funkcji biblioteki. Na przykład w przypadku Google Analytics możesz przejść na platformę Measurement Protocol Google, zamiast korzystać z oficjalnej wersji JavaScriptu hostowanej zdalnie, zgodnie z opisem w przewodniku po Google Analytics 4.

Aktualizowanie polityki bezpieczeństwa treści

Element "content_security_policy" nie został usunięty z pliku manifest.json, ale jest to teraz słownik obsługujący 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: odwołuje się do kontekstów w rozszerzeniu, w tym plików HTML i skryptów service worker.

sandbox: odwołuje się do wszystkich stron rozszerzeń działających w trybie piaskownicy, z których korzysta Twoje rozszerzenie.

Usuwanie nieobsługiwanych zasad bezpieczeństwa treści

Plik Manifest V3 nie zezwala w polu "extension_pages" na pewne wartości polityki bezpieczeństwa treści, które są dozwolone w pliku Manifest V2. W szczególności Manifest V3 nie zezwala na te, które umożliwiają zdalne wykonywanie kodu. Dyrektywy object-src i worker-src script-src, mogą mieć tylko te wartości:

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

Wartości polityki bezpieczeństwa treści dla domeny sandbox nie mają takich nowych ograniczeń.