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 (ayarladığınız herhangi bir identifiersPrefix değerinin önüne eklenir; böylece checkout_
vm_checkout_... olur). 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 let vmd bildirimi aynı
kapsama düşer ve ayrıştırıcı ikincisini reddeder.
VM ile obfuscate edilen her dosya, son eki olmayan bir en üst düzey çalışma zamanı adı bildirir ve bu, çakışma için yeterlidir.
renameGlobals: true durumu çok daha kötüleştirir: her en üst düzey bildirim kısa bir vm* adına dönüşür ve çalışma zamanının
kendi adları benzersiz son eklerini kaybeder.
Çö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, tek bir çok dosyalı toplu işlem içindeki her dosyaya ayrı bir önek ekler (ücretli planlar); ayrı toplu işlemlerden gelen dosyalar yine de çakışabilir. Bir paketleyici eklentisi kullanıyorsanız, aynısını yaptığını varsaymak yerine davranışını doğrulayın.
javascript-obfuscatorpaketini veya API'yi kendiniz çağırıyorsanı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 string'iidentifierNamesGenerator- ad biçimi (mangled,hexadecimal, …)
