निक के उत्तर में उद्धरण इस पर संकेत देता है। यह वास्तव में एक बड़ा अंतर नहीं है, लेकिन भावना यह है कि eval
new Function
से 'बदतर' है। सुरक्षा के मामले में नहीं - वे दोनों अविश्वसनीय इनपुट के चेहरे में समान रूप से बेकार हैं, लेकिन फिर उम्मीद है कि आपका वेबपैप अविश्वसनीय JSON तारों को वापस नहीं कर रहा है - लेकिन भाषा-स्तर की अजीबता के संदर्भ में, और इसलिए अनुकूलन के प्रतिरोध।
विशेष रूप
:
function victim() {
var a= 1;
eval('a= 2');
return a;
}
2
देता है।eval
एड स्ट्रिंग victim
के स्थानीय चरणीय दायरे पर संचालित है! यह ऐसा कुछ है जो नियमित उपयोगकर्ता-लिखित कार्य कभी नहीं कर सकता; eval
केवल ऐसा कर सकता है क्योंकि यह अंधेरा जादू है।
बजाय एक नियमित रूप से समारोह का उपयोग जादू के इस तत्व दूर ले जाता:
function victim() {
var a= 1;
(new Function('a= 2;'))();
return a;
}
ऊपर में
, लौटे a
1
रहता है; नया फंक्शन केवल अपने स्थानीय चर या वैश्विक window.a
पर काम कर सकता है।
वह ज्ञान कोड विश्लेषण उपकरण की अनुमति देता है - जिसमें जावास्क्रिप्ट इंजन और विशेष रूप से चालाक minifiers शामिल हो सकता है - अधिक अनुकूलन लागू करने के लिए। उदाहरण के लिए दूसरे victim
फ़ंक्शन में a
वैरिएबल return 1
पर पूरी तरह अनुकूलित हो सकता है। eval
का एक उपयोग और बहुत से संभावित अनुकूलन करने योग्य नहीं होंगे।
एक JSON
eval
एर की तरह एक छोटे से समारोह के लिए व्यवहार में बेशक
, वहाँ एक उल्लेखनीय अंतर होने के लिए नहीं जा रहा है, लेकिन सामान्य रूप में सोच है:
- से बचने के दोनों जहां भी संभव दृष्टिकोण (वे ईसीएमएस्क्रिप्ट फिफ्थ एडिशन के सख्त मोड में दोनों को अस्वीकार कर दिया गया है);
- यदि आपको एक का उपयोग करना है,
new Function
eval
के लिए बेहतर है, जब तक कि आपको कॉलिंग फ़ंक्शन के स्थानीय चरों तक पहुंचने के लिए वास्तव में कोड की आवश्यकता न हो। `दुर्भावनापूर्ण कोड अभी भी निष्पादित किया जाता है;
बुराई eval के रूप में – Anurag