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
evalinew 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:
- Wstrzykiwanie arkuszy stylów hostowanych zdalnie na stronę internetową za pomocą funkcji insertCSS
- W przypadku rozszerzeń korzystających z interfejsu
browser.devtools: inspectWindow.eval umożliwia wykonywanie kodu JavaScript w kontekście sprawdzanej strony. - Rozszerzenia debugera mogą używać funkcji browser.debugger.sendCommand do wykonywania kodu JavaScript w obiekcie docelowym debugowania.
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.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
W pliku skryptu działającego w tle.
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".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "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:
selfnonewasm-unsafe-eval- Tylko rozpakowane rozszerzenia: dowolne źródło localhost (
http://localhost,http://127.0.0.1lub dowolny port w tych domenach)
Wartości zasady bezpieczeństwa treści dla elementu sandbox nie podlegają takim nowym ograniczeniom.