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()
i 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
inew 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:
- Wstawianie do strony internetowej arkuszy stylów hostowanych zdalnie za pomocą InsertCSS
- Rozszerzenia korzystające z metody
chrome.devtools
: inspectWindow.eval umożliwia wykonywanie JavaScriptu w kontekście sprawdzanej strony. - Rozszerzenia debugera mogą używać funkcji chrome.debugger.sendCommand do wykonywania kodu JavaScript w docelowym obiekcie debugowania.
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
.
let name = 'World!'; chrome.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'; 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"
.
{ ... "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 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-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 zasad bezpieczeństwa treści w przypadku sandbox
nie mają takich nowych ograniczeń.