Dokümantasyon
/

Sorun giderme

/

Tanımlayıcı Çakışmalarından Kaçınma

Obfuscate Edilmiş Dosyalar Arasında Tanımlayıcı Çakışmalarından Kaçınma

VM ile obfuscate edilmiş birden fazla dosya aynı pakete girdiğinde, aynı en üst düzey tanımlayıcıyı bildirebilir ve sayfanın ayrıştırma sırasında çökmesine neden olabilir. Bunun neden olduğunu ve nasıl düzeltileceğini burada bulabilirsiniz.

Belirti

Derlemeniz sorunsuz çalışır, ancak tarayıcı uygulama başlamadan önce, ayrıştırma sırasında hata fırlatır:

Text

Hatadaki adı kaç parçanın (chunk) bildirdiğini görmek için o adın bildirimini içeren dosyaları sayın:

Text

-l eşleşen her dosyayı bir kez listeler, -w ise yalnızca tam sözcüklerle eşleşir; bu nedenle vmdX sayılmaz. var dışarıda bırakılır, çünkü bir var bildirimini tekrarlamak tek başına bir hata değildir. 1'den büyük bir sonuç, adın birden fazla parçada bildirildiği anlamına gelir. vmd yerine hata mesajınızdaki adı yazın.

Tanımlayıcı çakışmaları yalnızca bildirimler aynı kapsamı paylaştığında önem taşır. Aynı adın ayrı modüllerde veya closure'larda tekrarlanması çakışmanın kanıtı değildir; yukarıdaki ayrıştırma hatası ise kanıttır.

Bu neden olur

VM ön ayarları mangled-shuffled tanımlayıcı adı üretecini kullanır. Bu üreteç küçük bir alfabeyi karıştırılmış bir sırayla dolaşır ve VM obfuscation altında yeniden adlandırılan her global değişken bir vm öneki alır (varsayılan identifiersPrefix). Karıştırılmış sıra süreç başına önbelleğe alınır; bu nedenle aynı süreçte veya aynı sabit seed ile obfuscate edilen dosyalar aynı diziden beslenir - her dosyadaki ilk global değişken aynı adı paylaşır, ikincisi başka bir adı paylaşır ve bu böyle devam eder.

Her dosya bağımsız olarak obfuscate edilir ve üreteç her biri için dizisinin başından yeniden başlar. İki dosya aynı kapsamda bir araya geldiğinde adlar çakışır. En üst düzeydeki iki const vmd = … bildirimi aynı kapsama düşer ve ayrıştırıcı ikincisini reddeder.

Daha fazla en üst düzey tanımlayıcı ekleyen seçenekler, iki dosyanın aynı üretilmiş ada ulaşma olasılığını artırır. vmWrapTopLevelInitializers bunlardan biridir ve her VM ön ayarı onu zaten etkinleştirir; vmDynamicOpcodes veya vmBytecodeEncoding gibi seçenekler daha fazlasını ekler.

Çözümler

Önce paketlemeyi, ardından paketi tek seferde obfuscate etmeyi tercih edin. Dosyaları ayrı ayrı obfuscate ediyorsanız ve betikler aynı global kapsamı paylaşıyorsa, aşağıdakilerden birini seçin:

  • randomIdentifiersPrefix seçeneğini etkinleştirin (önerilen)

    Her obfuscation çalıştırması, her global tanımlayıcının başına eklenen rastgele bir önek alır (VM obfuscation altında bu, varsayılan vm önekinin yerini alır). Farklı dosyalardaki adlar artık aynı ad alanını paylaşmaz; böylece önekleri elle koordine etmenize gerek kalmadan çakışmalar ortadan kalkar.

  • Her dosya için benzersiz bir identifiersPrefix ayarlayın

    Her dosyayı obfuscate ederken elle farklı bir önek verin (örn. birinde identifiersPrefix: 'auth_', diğerinde checkout_). Etkilidir, ancak çok sayıda dosyanız varsa hataya açıktır; yukarıdaki rastgele seçeneği tercih edin.

    JavaScript

  • identifierNamesGenerator değerini hexadecimal olarak değiştirin

    Hexadecimal adlar çok daha geniş bir anahtar uzayı kullanır; bu nedenle iki dosyanın aynı tanımlayıcıyı üretme olasılığı çok daha düşüktür, ancak benzersizlik garanti edilmez. Ödünleşim: tanımlayıcılar mangled-shuffled çıktısından daha uzundur; bu nedenle paket biraz daha büyük olur.

  • Çok dosyalı toplu işlem arayüzünü kullanın veya paketleyici eklentinizi kontrol edin

    Panel, çok dosyalı toplu obfuscation kullandığınızda her dosyaya ayrı bir önek ekler; bu özellik ücretli planlarda kullanılabilir. Bir paketleyici eklentisi kullanıyorsanız, aynısını yaptığını varsaymak yerine davranışını doğrulayın. Obfuscation işlemini npm API'si ile elle kuruyorsanız, bir öneki kendiniz etkinleştirmeniz gerekir.

Düzeltmeyi doğrulamak için birleştirilmiş uygulamayı yeniden derleyip yükleyin ve SyntaxError hatasının ortadan kalktığını onaylayın. Eski hata mesajındaki ad artık birden fazla parçada bildirilmemelidir; bir önek her üretilmiş adı değiştirir, bu nedenle yukarıdaki grep size yalnızca o belirli ad hakkında bilgi verir, yenileri hakkında değil.

İlgili seçenekler