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
evalinew 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:
- Wstrzykiwanie arkuszy stylów hostowanych zdalnie do strony internetowej za pomocą funkcji insertCSS.
- W przypadku rozszerzeń korzystających z interfejsu
chrome.devtools: inspectWindow.eval umożliwia wykonywanie kodu JavaScript w kontekście sprawdzanej strony. - Rozszerzenia debugera mogą używać funkcji chrome.debugger.sendCommand do wykonywania kodu JavaScript w celu debugowania.
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.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
W pliku skryptu w tle.
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".
{ ... "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 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:
selfnonewasm-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ń.