Dokumentasi
/

Pemecahan masalah

/

Menghindari Tabrakan Pengenal

Menghindari Tabrakan Pengenal di Antara File Hasil Obfuskasi

Ketika beberapa file hasil obfuskasi VM berakhir di bundel yang sama, file-file itu dapat mendeklarasikan pengenal tingkat atas yang sama dan membuat halaman crash saat parsing. Berikut penyebabnya dan cara memperbaikinya.

Gejalanya

Build Anda berjalan lancar, tetapi peramban melempar error saat parsing, sebelum aplikasi dimulai:

Text

Untuk melihat berapa banyak chunk yang mendeklarasikan nama dari error tersebut, hitung file yang berisi deklarasinya:

Text

-l mencantumkan setiap file yang cocok satu kali dan -w hanya mencocokkan kata utuh, sehingga vmdX tidak ikut dihitung. var tidak disertakan karena mengulang deklarasi var bukanlah error dengan sendirinya. Hasil di atas 1 berarti nama tersebut dideklarasikan di lebih dari satu chunk. Ganti vmd dengan nama dari pesan error Anda.

Tabrakan pengenal hanya berpengaruh ketika deklarasinya berbagi scope yang sama. Nama yang sama yang berulang di modul atau closure terpisah bukan bukti adanya tabrakan; error parsing di atas adalah buktinya.

Mengapa ini terjadi

Preset VM menggunakan generator nama pengenal mangled-shuffled. Generator ini menelusuri alfabet kecil dalam urutan acak, dan di bawah obfuskasi VM setiap global yang diganti nama mendapat prefiks vm (nilai default identifiersPrefix). Urutan acak tersebut di-cache per proses, sehingga file yang diobfuskasi dalam proses yang sama, atau dengan seed tetap yang sama, mengambil dari urutan yang sama - global pertama di setiap file memiliki nama yang sama, global kedua memiliki nama lain yang sama, dan seterusnya.

Setiap file diobfuskasi secara independen dan generator mengulang dari awal urutannya untuk setiap file. Ketika dua file berakhir di scope yang sama, nama-namanya bertabrakan. Dua deklarasi const vmd = … tingkat atas jatuh di scope yang sama dan parser menolak yang kedua.

Opsi yang memperkenalkan lebih banyak pengenal tingkat atas meningkatkan peluang dua file mencapai nama hasil generate yang sama. vmWrapTopLevelInitializers adalah salah satunya, dan setiap preset VM sudah mengaktifkannya; opsi seperti vmDynamicOpcodes atau vmBytecodeEncoding menambah lebih banyak lagi.

Perbaikan

Sebaiknya bundel dulu, lalu obfuskasi bundel tersebut sekali. Jika Anda memang mengobfuskasi secara terpisah dan script-script itu berbagi scope global, pilih salah satu dari berikut:

  • Aktifkan randomIdentifiersPrefix (direkomendasikan)

    Setiap proses obfuskasi mendapatkan prefiks acak yang ditambahkan di depan setiap pengenal global (pada obfuskasi VM, prefiks ini menggantikan prefiks bawaan vm). Nama dari file yang berbeda tidak lagi berbagi namespace, sehingga tabrakan hilang tanpa Anda harus mengoordinasikan prefiks secara manual.

  • Setel identifiersPrefix unik per file

    Berikan prefiks yang berbeda secara manual saat mengobfuskasi setiap file (misalnya identifiersPrefix: 'auth_' untuk satu file, checkout_ untuk file lain). Efektif, tetapi rawan kesalahan jika Anda memiliki banyak file; lebih baik gunakan opsi acak di atas.

    JavaScript

  • Ubah identifierNamesGenerator menjadi hexadecimal

    Nama heksadesimal menggunakan ruang kunci yang jauh lebih besar, sehingga kecil kemungkinan dua file menghasilkan pengenal yang sama, tetapi keunikannya tidak dijamin. Konsekuensinya: pengenal lebih panjang daripada keluaran mangled-shuffled, sehingga bundel sedikit lebih besar.

  • Gunakan UI batch multi-file, atau periksa plugin bundler Anda

    Dasbor menambahkan prefiks yang berbeda per file saat Anda menggunakan obfuskasi batch multi-file, yang tersedia pada paket berbayar. Jika Anda menggunakan plugin bundler, verifikasi perilakunya alih-alih berasumsi bahwa plugin itu melakukan hal yang sama. Jika Anda menyiapkan obfuskasi secara manual dengan API npm, Anda harus mengaktifkan prefiks sendiri.

Untuk memverifikasi perbaikan, build ulang dan muat ulang aplikasi gabungan, lalu pastikan SyntaxError sudah hilang. Nama dari pesan error sebelumnya seharusnya tidak lagi dideklarasikan di lebih dari satu chunk; prefiks mengubah setiap nama hasil generate, jadi grep di atas hanya memberi tahu Anda tentang nama tersebut, bukan tentang nama-nama yang baru.

Opsi terkait