Poprawa zabezpieczeń w pliku manifestu w wersji 3
To ostatnia z 3 sekcji opisujących zmiany potrzebne w kodzie, który nie jest częścią rozszerzenia usługi. Opisuje ona zmiany wymagane w celu zwiększenia bezpieczeństwa rozszerzeń. Pozostałe 2 sekcje dotyczą aktualizowania kodu, który jest potrzebny do przejścia na Manifest V3, oraz zastępowania blokujących żądań internetowych.
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 rozszerzenia.
- Zaktualizuj odwołania do skryptu i stylów, aby wczytywać zasoby z pakietu rozszerzenia.
- Użyj funkcji
chrome.runtime.getURL()
, aby tworzyć adresy URL zasobów w czasie wykonywania. - 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 executeScript()
.
Istnieją jednak specjalne przypadki, w których nadal można wykonać dowolny ciąg znaków:
- Wstawianie hostowanych zdalnie arkuszy stylów do strony internetowej za pomocą insertCSS
- W przypadku rozszerzeń używających
chrome.devtools
: inspectWindow.eval umożliwia uruchamianie kodu JavaScript w kontekście skanowanej strony. - Rozszerzenia debugera mogą używać funkcji chrome.debugger.sendCommand do wykonywania kodu JavaScript w docelowym obiekcie debugowania.
Usuwanie kodu hostowanego zdalnie
W przypadku platformy Manifest V3 cała logika rozszerzenia musi znajdować się w pakiecie rozszerzenia. Zgodnie z zasadami Chrome Web Store nie można już wczytywać ani wykonywać 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.
W zależności od przypadku użycia i powodu korzystania z hostingu zdalnego dostępne są alternatywne rozwiązania. W tej sekcji znajdziesz opisy metod, które warto wziąć pod uwagę. Jeśli masz problemy z kodem hostowanym zdalnie, zapoznaj się z tymi wskazówkami.
Funkcje i logika oparte 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.
Logikę zewnętrzną z usługą zewnętrzną
rozszerzenie wywołuje usługę internetową na zdalnym serwerze. Dzięki temu możesz zachować kod w prywatności i zmieniać go w miarę potrzeby, unikając dodatkowego obciążenia związanego z ponownie przesyłaniem go 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 uwzględnić bibliotekę w usługach działających w tle, ustaw w pliku manifestu klucz "background.type"
na "module"
i użyj instrukcji import
.
Korzystanie z bibliotek zewnętrznych w skryptach wstrzykiwanych w kartach
Możesz też wczytywać biblioteki zewnętrzne w czasie wykonywania, dodając je do tablicy files
podczas wywoływania funkcji scripting.executeScript()
. Dane możesz nadal wczytywać zdalnie w czasie wykonywania.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
Wstawianie funkcji
Jeśli potrzebujesz większej dynamiki, nowa właściwość func
w elementach 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}!')` });
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 wstrzyknięcia funkcji, który możesz przejrzeć krok po kroku. Przykład funkcji getCurrentTab()
znajdziesz w sekcji Informacje.
Poszukaj innych rozwiązań
Jeśli poprzednie metody nie pomogą w Twoim przypadku, być może trzeba będzie znaleźć alternatywne rozwiązanie (np. przejść na inną bibliotekę) lub znaleźć inne sposoby korzystania z funkcji biblioteki. Na przykład w przypadku Google Analytics możesz zamiast oficjalnej wersji JavaScript hostowanej zdalnie przejść na platformę Measurement Protocol od Google, jak opisano w przewodniku Google Analytics 4.
Zaktualizuj zasady zabezpieczeń treści
Obiekt "content_security_policy"
nie został usunięty 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 plików HTML i usług.
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ń.