Direct eval() VM ऑब्फ़स्केशन को बंद कर देता है

अगर किसी फ़ंक्शन के बॉडी में कहीं भी (नेस्टेड फ़ंक्शन्स सहित) direct eval(code) कॉल हो, तो VM ऑब्फ़स्केशन उस फ़ंक्शन को छोड़ देता है और ऑब्फ़स्केटर VMDynamicCodeSkipped चेतावनी देता है (फ़ंक्शन का नाम हो तो उसे बताते हुए)। root मोड (डिफ़ॉल्ट) में पूरा फ़ंक्शन और उसके सभी नेस्टेड फ़ंक्शन्स छोड़ दिए जाते हैं; comment मोड में आपके द्वारा अलग से चिह्नित नेस्टेड फ़ंक्शन फिर भी वर्चुअलाइज़ होता है, जब तक कि उसमें खुद eval न हो। गैर-स्टैटिक आर्ग्युमेंट वाला direct eval DynamicCodeRenameRisk चेतावनी भी देता है। ऐसा इसलिए है क्योंकि direct eval की पहुँच आसपास के फ़ंक्शन के लोकल वेरिएबल्स तक होती है, जो फ़ंक्शन के VM बाइटकोड में कंपाइल होने के बाद उपलब्ध नहीं रहते।

IIFE में रैप किए गए कोड के लिए महत्वपूर्ण। अगर किसी टॉप-लेवल IIFE के अंदर कहीं गहराई में भी कोई direct eval हो, तो पूरा IIFE (आपके सारे कोड सहित) VM-ऑब्फ़स्केट नहीं होगा।

JavaScript

IIFE को हटाने का एक समझौता है: जब आपके फ़ंक्शन टॉप लेवल पर आ जाते हैं, तो केवल समस्या वाला फ़ंक्शन छोड़ा जाता है, लेकिन बाकी फ़ंक्शन अब रूट-लेवल के होते हैं, इसलिए VM ऑब्फ़स्केशन उनके नाम बनाए रखता है। उन नामों को आउटपुट से बाहर रखने के तरीके के लिए LLM विश्लेषण से फ़ंक्शन नाम छिपाना देखें।

(0, eval)(code) और window.eval(code) जैसे indirect रूप VM ऑब्फ़स्केशन को नहीं रोकते। eval?.(code) एक अपवाद है: JavaScript इसे indirect eval के रूप में चलाता है, लेकिन ऑब्फ़स्केटर सावधानी के तौर पर इसे direct eval मानता है और फ़ंक्शन को छोड़ देता है।

Function कंस्ट्रक्टर (new Function(body) / Function(body)) के साथ भी यही बर्ताव होता है, जब बॉडी आर्ग्युमेंट डायनामिक हो। डायनामिक new Function(...) कॉल वाले फ़ंक्शन को भी VMDynamicCodeSkipped चेतावनी के साथ छोड़ दिया जाता है। डायनामिक direct eval की तरह ही, ऑब्फ़स्केटर DynamicCodeRenameRisk चेतावनी भी जोड़ता है, क्योंकि रनटाइम पर बनी बॉडी नाम बदले गए आइडेंटिफ़ायर्स का संदर्भ दे सकती है। new Function('a', 'b', 'return a + b') जैसी पूरी तरह स्टैटिक कॉल्स को नहीं छोड़ा जाता।

Indirect eval और Function कंस्ट्रक्टर ग्लोबल स्कोप में चलते हैं। वे कॉल करने वाले के लोकल वेरिएबल्स नहीं पढ़ सकते, लेकिन तब भी विफल हो सकते हैं जब वे ऐसे ग्लोबल्स का संदर्भ दें जिनका नाम बदला गया हो या जिन्हें हटा दिया गया हो। केवल अपने पैरामीटर्स का उपयोग करने वाली स्टैटिक बॉडी, जैसे new Function('a', 'b', 'return a + b'), इस निर्भरता से बचती है। चेतावनियों की समीक्षा करें और अंतिम बंडल का परीक्षण करें; केवल eval का सिंटैक्स बदलने से मनमाना डायनामिक कोड सुरक्षित नहीं हो जाता।

बचाव का रास्ता (v6.14.0+): फिर भी आसपास के फ़ंक्शन को बाइटकोड में बदलने और VMDynamicCodeSkipped को दबाने के लिए vmForceCompileDynamicCode: true सेट करें (या VM सेक्शन के ओवरराइड्स समूह में Force Compile Dynamic Code स्विच चालू करें)। यह स्कोप को ठीक नहीं कर सकता: फ़ोर्स-कंपाइल किए गए फ़ंक्शन के अंदर direct eval फ़ंक्शन के लोकल वेरिएबल्स, उसके पैरामीटर्स या किसी वर्चुअलाइज़ किए गए बाहरी फ़ंक्शन के वेरिएबल्स को न पढ़ सकता है, न उनमें लिख सकता है, भले ही कोड एक स्ट्रिंग लिटरल हो। इसका उपयोग केवल तभी करें जब eval किया जाने वाला कोड ग्लोबल्स के अलावा किसी चीज़ का संदर्भ न दे। यह विकल्प चालू होने पर भी DynamicCodeRenameRisk दिखती रहती है, क्योंकि जिस नाम-बदलाव जोखिम का वह वर्णन करती है, वह VM से छोड़े जाने से स्वतंत्र है।

पूरी तालिका, चेतावनियों के स्वरूप और समाधानों के लिए eval और new Function के साथ VM ऑब्फ़स्केशन देखें।