Postępowanie w przypadku naruszeń kodu hostowanych zdalnie

W Chrome Web Store nazywa się wszystko, co w Chrome Web Store nazywa się kodem hostowanym zdalnie (RHC) jest wykonywana przez przeglądarkę wczytywaną z innego miejsca niż z plików rozszerzenia. np. JavaScript czy WASM. Nie: takich jak JSON czy CSS.

Dlaczego RHC nie jest już dozwolone?

W przypadku rozszerzeń platformy Manifest V3 muszą teraz umieszczać w pakiecie cały kod, którego używają w środku. przez rozszerzenie. Wcześniej można było dynamicznie wstrzykiwać tagi skryptu z z dowolnego adresu URL w sieci.

Widzę, że moje rozszerzenie ma RHC. Co się dzieje?

Jeśli podczas sprawdzania rozszerzenie zostało odrzucone z powodu błędu niebieskiego argonu: według naszych weryfikatorów Twoje rozszerzenie wykorzystuje kod hostowany zdalnie. To jest zwykle jest wynikiem próby dodania przez rozszerzenie tagu skryptu z pilotem. (np. z otwartej sieci, a nie z plików zawartych w rozszerzenie) lub pobieranie zasobu do bezpośredniego wykonania.

Jak rozpoznać RHC

Rozpoznanie RHC nie jest szczególnie trudne, gdy wiesz, na co zwracać uwagę. Po pierwsze, sprawdź, czy ciąg znaków „http://” lub „https://” w Twoim projekcie. Jeśli posiadasz lub naruszenie RHC, to prawdopodobnie będzie można je zlokalizować. Jeśli masz pełny system kompilacji albo użyj zależności z npm lub innej źródeł innych firm, upewnij się, że przeszukujesz skompilowaną wersję kodu, ponieważ to właśnie jest oceniany przez sklep. Jeśli nadal nie możesz znajdziesz problem, skontaktuj się z zespołem pomocy One Stop. Ta możemy wskazać konkretne naruszenia i zrozumieć, co jest potrzebne, opublikowano je tak szybko, jak to możliwe.

Co zrobić, gdy biblioteka prosi o kod

Niezależnie od tego, skąd pochodzi kod, nie może on mieć RHC. Ten zawiera kod, który nie został utworzony przez Ciebie, ale został użyty jako zależność w w projektach AI. Niektórzy deweloperzy korzystający z Firebase napotkali ten problem podczas pracy zdalnej do użycia w Uwierzytelnianiu Firebase. Mimo że był to własnej biblioteki (czyli należącej do firmy Google), w przypadku RHC nie jest stosowany żaden wyjątek. Potrzebujesz aby skonfigurować kod tak, aby usuwał RHC lub zmieniał punkt umieść kod na początku. Jeśli napotkasz problem, który nie jest Twoim kodem która wczytuje RHC, ale używaną bibliotekę, najlepiej będzie skontaktować się z jej autorem. Poinformuj ich o tym, i poproś o obejście lub aktualizację kodu.

Co zrobić, jeśli nie możesz się doczekać aktualizacji biblioteki

Niektóre biblioteki wysyłają aktualizację niemal natychmiast po otrzymaniu powiadomienia, ale inne mogą zostać porzucone lub trzeba będzie poświęcić trochę czasu na rozwiązanie problemu. W zależności od tego, co dotyczy konkretnego naruszenia, nie musisz czekać, aż przenieść strony do odblokowania i pomyślnego sprawdzenia. Dostępnych jest wiele aby szybko wrócić do pracy.

Sprawdź kod

Czy na pewno masz pewność, że kod wywołujący żądanie jest potrzebny? Jeśli może może zostać usunięta. Można też usunąć wywołującą ją bibliotekę, a następnie usunąć i wykonuje zadanie.

Czy istnieje inna biblioteka, która oferuje te same funkcje? Wypróbuj sprawdź na npmjs.com, GitHubie i innych stronach, czy nie ma innych opcji, które spełniają te same przypadki użycia.

Trzęsienie drzew

Jeśli kod powodujący naruszenie zasad RHC nie jest faktycznie używany, być może mogą zostać automatycznie usunięte przy użyciu narzędzi. Nowoczesne narzędzia do tworzenia, takie jak webpack, Rollup i Vite mają funkcje co nazywamy potrząsaniem drzew. Po włączeniu w systemie kompilacji potrząsanie drzewem powinien usunąć wszystkie nieużywane ścieżki kodu. Oznacza to, że nie tylko masz ale też szybszą i łatwiejszą w obsłudze. To ważne że nie wszystkie biblioteki dają się potrząsać drzewem, ale wiele z nich już tak. Niektóre takie jak Rollup i Vite, mają domyślnie włączone wstrząsanie drzew. Webpack wymaga konfiguracji. Jeśli nie używasz kompilacji system jest częścią rozszerzenia, ale korzysta z bibliotek kodu, zachęcam do przejrzenia i dodania narzędzia do kompilacji. Kompilacja pozwalają tworzyć bezpieczniejsze, bardziej niezawodne i łatwiejsze w utrzymaniu projekty.

Sposób implementacji drzewek zależy od konkretnego projektu. Na przykład z funkcją Rollup można dodać funkcję hakowania, kompilowanie kodu projektu. Jeśli na przykład masz plik, który loguje się tylko na konto Uwierzytelnianie Firebase, main.js:

import { GoogleAuthProvider, initializeAuth } from "firebase/auth";

chrome.identity.getAuthToken({ 'interactive': true }, async (token) => {
  const credential = GoogleAuthProvider.credential(null, token);
  try {
    const app = initializeApp({ ... });
    const auth = initializeAuth(app, { popupRedirectResolver: undefined, persistence: indexDBLocalPersistence });
    const { user } = await auth.signInWithCredential(credential)
    console.log(user)
  } catch (e) {
    console.error(error);
  }
});

Wystarczy powiedzieć Rollup, że plik wejściowy jest potrzebny, załaduj pliki węzłów @rollup/plugin-node-resolve i nazwę danych wyjściowych; generowanego przez niego pliku.

npx rollup --input main.js --plugin '@rollup/plugin-node-resolve' --file compiled.js

Po uruchomieniu tego polecenia w oknie terminala otrzymasz wygenerowaną wersję main.js, zebrane w jeden plik o nazwie compiled.js.

Podsumowywanie może być proste, ale można je też bardzo skonfigurować. Możesz dodać wszelkiego rodzaju złożonej logiki i konfiguracji, zapoznaj się z ich dokumentacją. Dodanie tego typu narzędzi pozwoli wygenerować mniejszy i wydajniejszy kod, i tym razem rozwiązuje problem z kodem hostowanym zdalnie.

Automatyczne edytowanie plików

Częstym sposobem wprowadzania kodu hostowanego zdalnie jest jako podzależność biblioteki, do której dołączasz. Jeśli biblioteka X chce import Y z sieci CDN, musisz ją jeszcze zaktualizować, ze źródła lokalnego. Dzięki nowoczesnym systemom kompilacji możesz łatwo tworzyć do wyodrębniania zdalnego odwołania i umieszczania go bezpośrednio w kodzie.

Oznacza to, że kod wygląda tak:

import moment from "https://unpkg.com/moment@2.29.4/moment.js"
console.log(moment())

Możesz utworzyć małą wtyczkę do podłączania kanałów.

import { existsSync } from 'fs';
import fetch from 'node-fetch';

export default {
  plugins: [{
    load: async function transform(id, options, outputOptions) {
      // this code runs over all of out javascript, so we check every import
      // to see if it resolves as a local file, if that fails, we grab it from
      // the network using fetch, and return the contents of that file directly inline
      if (!existsSync(id)) {
        const response = await fetch(id);
        const code = await response.text();

        return code
      }
      return null
    }
  }]
};

Po uruchomieniu kompilacji z nową wtyczką każdy zdalny adres URL import zostanie niezależnie od tego, czy był to nasz kod, podzależność, lub podzależności ani w innych przypadkach.

npx rollup --input main.js --config ./rollup.config.mjs --file compiled.js

Ręczne edytowanie plików

Najprostszym sposobem jest usunięcie kodu, który wywołuje RHC. Otwórz w z wybranego edytora tekstu i usuń wiersze naruszające zasady. Zwykle jest to niezalecane, ponieważ jest kruche i można go zapomnieć. Sprawia, że: aby projekt był skuteczniejszy, gdy plik o nazwie „library.min.js” nie jest actual.min.js. Zamiast edytować nieprzetworzone pliki, jest takie narzędzie jak patch-package. To jest super pozwalająca zapisywać modyfikacje w pliku zamiast pliku. Działa na plikach poprawek, obsługuje systemy kontroli wersji, takie jak Git i Subversion. Potrzebujesz tylko ręcznie zmodyfikować kod naruszający zasady, zapisać plik diff i skonfigurować pakietu poprawek ze zmianami, które chcesz zastosować. Możesz przeczytać cały samouczek w pliku odczytu projektu. Jeśli wprowadzasz poprawki w projekcie, naprawdę zachęć do skontaktowania się z zespołem projektu i poproszenia o wprowadzenie zmian w górę i w dół. Pakiet poprawek znacznie ułatwia zarządzanie poprawkami, nic nie poprawia się.

Co zrobić, jeśli kod nie jest używany

W miarę wzrostu baz kodu rosną zależności (lub zależności może zachować ścieżki kodu, które nie są już używane. Jeśli jedna z tych sekcji zawiera kod do wczytania lub wykonania RHC, to musi zostać usunięty. it nieważne, czy jest martwa, czy nieużywana. Jeśli nie jest używana, powinna być przez hakowanie drzew lub poprzez łatanie biblioteki.

Czy jest jakieś sposób obejścia tego problemu?

Zasadniczo nie. RHC jest niedozwolone. Istnieje jednak niewielka liczba gdy jest dozwolone. Są to niemal zawsze przypadki, nie jest możliwe w przypadku żadnej innej opcji.

Interfejs User Scripts API

Skrypty użytkownika to niewielkie fragmenty kodu, które zwykle są dostarczane przez użytkownika, przeznaczone dla menedżerów skryptów użytkowników, takich jak TamperMonkey czy Brutalna małpa. Menedżerowie nie mogą łączyć w pakiet kodu, który jest pisany przez użytkowników, więc interfejs User Script API zapewnia sposób wykonywania kodu podane przez użytkownika. To nie zastępuje chrome.scripting.executeScript lub w innym środowisku do wykonywania kodu. Aby wykonać dowolne działanie, użytkownicy muszą włączyć tryb programisty. Jeśli przeglądarka Chrome Zespół ds. opinii o sklepach uznał, że te informacje są używane w inny sposób przeznaczonych dla (tj. kodu podanego przez użytkownika), może zostać odrzucony informacje o produkcie zostały usunięte ze sklepu.

chrome.debugger

Interfejs API chrome.debugger zapewnia rozszerzeniom możliwość interakcji z nimi protokół Chrome Devtools. To ten sam protokół, który jest używany do Narzędzia deweloperskie w Chrome oraz ogromną liczbę innych narzędzi. Dzięki temu może żądać i uruchamiać zdalny kod. Podobnie jak skrypty użytkownika, zamiennik chrome.scripting i zapewnia znacznie lepsze wrażenia użytkownikom. Podczas korzystania użytkownik zobaczy pasek ostrzeżenia u góry okno. Gdy baner zostanie zamknięty lub zamknięty, sesja debugowania zamknięte.

Zrzut ekranu paska adresu w Chrome z komunikatem „Rozszerzenie debugera rozpoczęło debugowanie tej przeglądarki”
Zrzut ekranu paska adresu w Chrome z komunikatem „Rozszerzenie debugera rozpoczęło debugowanie tej przeglądarki”

Elementy iframe w trybie piaskownicy

Jeśli chcesz ocenić ciąg znaków jako kod w środowisku DOM (np. skryptu treści zamiast skryptu service worker, możesz wybrać inną opcję jest użycie elementu iframe umieszczonego w piaskownicy. Rozszerzenia nie obsługują takich funkcji jak eval(). Złośliwy kod może zagrażać bezpieczeństwu użytkowników i bezpieczeństwa. Jeśli jednak kod jest wykonywany tylko w znanym miejscu takich jak element iframe, który został oddzielony od reszty sieci, to ryzyko jest znacznie ograniczone. W tym kontekście Content Security Zasada, która blokuje użycie oceny, można znieść, umożliwiając uruchamianie prawidłowy kod JavaScript.

Jeśli masz inny przypadek użycia, skontaktuj się z zespołem za pomocą listy adresowej chromium-extensions, aby uzyskać opinie, lub otwórz nowy zgłoszenie z prośbą o wskazówki pomocy One Stop

Co zrobić, jeśli nie zgadzasz się z oceną

Egzekwowanie zasad może być złożone z niuansów, a weryfikacja wymaga ręcznego wprowadzenia, co oznacza, zespół Chrome Web Store może czasami zgodzić się na zmianę decyzji dotyczącej sprawdzenia. Jeśli uważasz, że popełniono błąd, możesz odwołać się od decyzji o odrzuceniu korzystając z pomocy kompleksowej