Menghindari tabrakan pengenal antar berkas hasil obfuskasi
Ketika beberapa berkas hasil obfuskasi VM berakhir di dalam bundel yang sama, keduanya dapat mendeklarasikan pengenal tingkat atas yang sama dan membuat halaman crash saat parsing. Berikut alasannya dan cara memperbaikinya.
Gejalanya
Build Anda berjalan lancar, tetapi peramban melempar error saat parsing, sebelum aplikasi dimulai:
Pemeriksaan cepat di seluruh bundel memastikan bahwa pengenal yang sama dideklarasikan di lebih dari satu chunk:
Mengapa ini terjadi
Secara bawaan, obfuskasi VM menggunakan generator nama pengenal mangled-shuffled. Ia menelusuri alfabet kecil dalam
urutan acak yang deterministik, dan menambahkan awalan vm pada variabel global yang diperkenalkan oleh runtime. Kedua berkas mengeluarkan pengenal
dari urutan acak yang sama — sehingga global pertama di masing-masing berkas berbagi nama yang sama, global kedua berbagi nama lain, dan seterusnya.
Setiap berkas diobfuskasi secara terpisah dan generator memulai ulang dari awal urutannya untuk setiap berkas. Ketika
dua berkas berakhir di dalam bundel yang sama, nama-namanya bertabrakan. Dua deklarasi const vmd = … di tingkat atas berada di scope
yang sama dan parser menolak deklarasi yang kedua.
Perbaikan
Pilih salah satu berikut — opsi pertama adalah perbaikan yang direkomendasikan:
Aktifkan
randomIdentifiersPrefix(direkomendasikan)Setiap proses obfuskasi mendapatkan awalan acak yang unik di depan setiap pengenal yang dihasilkan. Nama dari berkas yang berbeda tidak lagi berbagi namespace, sehingga tabrakan hilang tanpa Anda harus mengoordinasikan awalan secara manual.
Setel
identifiersPrefixyang unik per berkasBerikan awalan yang berbeda secara manual saat mengobfuskasi setiap berkas (mis.
identifiersPrefix: 'auth_'untuk satu,checkout_untuk yang lain). Efektif, tetapi rawan kesalahan jika Anda memiliki banyak berkas — lebih baik gunakan opsi acak di atas.Ubah
identifierNamesGeneratormenjadihexadecimalNama heksadesimal menggunakan ruang kunci yang jauh lebih besar, sehingga peluang dua berkas menghasilkan pengenal yang sama sangat kecil. Konsekuensinya: pengenal menjadi lebih panjang daripada keluaran
mangled-shuffled, sehingga bundel sedikit lebih besar.Gunakan plugin bundler atau UI batch multi-berkas
Sebagian besar plugin bundler resmi (webpack, Rollup, Vite) menangani keunikan awalan secara otomatis antar berkas dalam satu build. UI obfuscator.io juga menanganinya ketika Anda menggunakan obfuskasi batch multi-berkas. Jika Anda merangkai obfuskasi secara manual dengan API npm, Anda harus mengaktifkan sendiri awalan acaknya.
Opsi terkait
randomIdentifiersPrefix— awalan acak per build (direkomendasikan)identifiersPrefix— string awalan eksplisitidentifierNamesGenerator— bentuk nama (mangled,hexadecimal, …)
