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:

Metin

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

Metin

-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:

  • 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, 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-obfuscator paketini 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