Dokumentacja
/
Przepisy
/

Unikanie kolizji identyfikatorów

Unikanie kolizji identyfikatorów między zobfuskowanymi plikami

Gdy w jednej paczce znajdzie się kilka plików zobfuskowanych przez VM, mogą one zadeklarować ten sam identyfikator najwyższego poziomu i wysypać stronę już na etapie parsowania. Oto skąd się to bierze i jak temu zaradzić.

Objaw

Budowanie przebiega bez zakłóceń, ale przeglądarka zgłasza błąd już na etapie parsowania, zanim aplikacja wystartuje:

browser console

Błąd

Szybkie sprawdzenie zawartości paczki potwierdza, że ten sam identyfikator jest deklarowany w więcej niż jednym fragmencie:

terminal

Shell

Dlaczego tak się dzieje

Domyślnie obfuskacja VM korzysta z generatora nazw identyfikatorów mangled-shuffled. Przechodzi on przez niewielki alfabet w deterministycznie przetasowanej kolejności i dodaje prefiks vm do zmiennych globalnych wprowadzanych przez środowisko uruchomieniowe. Oba pliki generują identyfikatory z tej samej przetasowanej sekwencji — pierwsza zmienna globalna w każdym pliku otrzymuje więc tę samą nazwę, druga kolejną wspólną i tak dalej.

Każdy plik jest obfuskowany niezależnie, a generator dla każdego z nich zaczyna swoją sekwencję od początku. Gdy dwa pliki trafią do jednej paczki, nazwy kolidują ze sobą. Dwie deklaracje const vmd = … najwyższego poziomu lądują w tym samym zasięgu, a parser odrzuca drugą z nich.

Rozwiązania

Należy wybrać jedno z poniższych — pierwsza opcja jest rozwiązaniem zalecanym:

  • Włączenie randomIdentifiersPrefix (zalecane)

    Każde uruchomienie obfuskacji otrzymuje unikalny losowy prefiks dodawany do wszystkich generowanych identyfikatorów. Nazwy z różnych plików przestają dzielić wspólną przestrzeń nazw, więc kolizje znikają bez konieczności ręcznego uzgadniania prefiksów.

  • Ustawienie unikalnego identifiersPrefix dla każdego pliku

    Przy obfuskacji każdego pliku należy ręcznie przekazać inny prefiks (np. identifiersPrefix: 'auth_' dla jednego, checkout_ dla drugiego). Skuteczne, ale przy większej liczbie plików podatne na pomyłki — lepiej sięgnąć po losowy prefiks opisany wyżej.

  • Przełączenie identifierNamesGenerator na hexadecimal

    Nazwy szesnastkowe korzystają ze znacznie większej przestrzeni, więc szansa, że dwa pliki wygenerują ten sam identyfikator, jest znikoma. Kompromis: identyfikatory są dłuższe niż te z mangled-shuffled, przez co paczka jest nieco większa.

  • Skorzystanie z wtyczki do bundlera lub z wsadowego interfejsu wielu plików

    Większość oficjalnych wtyczek do bundlerów (webpack, Rollup, Vite) samodzielnie dba o unikalność prefiksów między plikami w ramach jednego budowania. Interfejs obfuscator.io również robi to przy wsadowej obfuskacji wielu plików. Przy ręcznym podpinaniu obfuskacji przez API pakietu npm losowy prefiks trzeba włączyć samodzielnie.

Powiązane opcje