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:
Szybkie sprawdzenie zawartości paczki potwierdza, że ten sam identyfikator jest deklarowany w więcej niż jednym fragmencie:
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
identifiersPrefixdla każdego plikuPrzy 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
identifierNamesGeneratornahexadecimalNazwy 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
randomIdentifiersPrefix— losowy prefiks dla każdego budowania (zalecane)identifiersPrefix— jawnie podany ciąg prefiksuidentifierNamesGenerator— postać nazw (mangled,hexadecimal, …)
