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:
Hatadaki adı kaç parçanın (chunk) bildirdiğini görmek için o adın bildirimini içeren dosyaları sayın:
-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:
randomIdentifiersPrefixseç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
identifiersPrefixayarlayınHer dosyayı obfuscate ederken elle farklı bir önek verin (örn. birinde
identifiersPrefix: 'auth_', diğerindecheckout_). Etkilidir, ancak çok sayıda dosyanız varsa hataya açıktır; yukarıdaki rastgele seçeneği tercih edin.identifierNamesGeneratordeğerinihexadecimalolarak değiştirinHexadecimal 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
randomIdentifiersPrefix- derleme başına rastgele önek (önerilen)identifiersPrefix- açık önek dizesiidentifierNamesGenerator- ad biçimi (mangled,hexadecimal, …)
