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
inew 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:
- Wstawianie na stronie internetowej arkuszy stylów hostowanych zdalnie za pomocą insertCSS
- W przypadku rozszerzeń korzystających z metody
chrome.devtools
: inspectWindow.eval umożliwia wykonywanie kodu JavaScript w kontekście sprawdzanej strony. - Rozszerzenia debugera mogą używać polecenia chrome.debugger.sendCommand do wykonywania kodu JavaScript w celu debugowania.
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
.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
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], });
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"
.
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "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ń.