2010-03-15 8 views
17

This link आपको दिखाता है कि jQuery पुराने ब्राउज़र के लिए (new Function("return " + data))(); का उपयोग करता है, eval() के बजाय JSON स्ट्रिंग को पार्स करने के लिए।jQuery उपयोग करता है (नया फ़ंक्शन ("वापसी" + डेटा))(); eval (डेटा) के बजाय; JSON पार्स करने के लिए, क्यों?

इसका क्या फायदा है? क्या होगा यदि JSON स्ट्रिंग सुरक्षित नहीं है?

+3

बुराई eval के रूप में – Anurag

उत्तर

31

निक के उत्तर में उद्धरण इस पर संकेत देता है। यह वास्तव में एक बड़ा अंतर नहीं है, लेकिन भावना यह है कि evalnew 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; 
} 
ऊपर में

, लौटे a1 रहता है; नया फंक्शन केवल अपने स्थानीय चर या वैश्विक window.a पर काम कर सकता है।

वह ज्ञान कोड विश्लेषण उपकरण की अनुमति देता है - जिसमें जावास्क्रिप्ट इंजन और विशेष रूप से चालाक minifiers शामिल हो सकता है - अधिक अनुकूलन लागू करने के लिए। उदाहरण के लिए दूसरे victim फ़ंक्शन में a वैरिएबल return 1 पर पूरी तरह अनुकूलित हो सकता है। eval का एक उपयोग और बहुत से संभावित अनुकूलन करने योग्य नहीं होंगे।

एक JSON eval एर की तरह एक छोटे से समारोह के लिए व्यवहार में बेशक

, वहाँ एक उल्लेखनीय अंतर होने के लिए नहीं जा रहा है, लेकिन सामान्य रूप में सोच है:

  • से बचने के दोनों जहां भी संभव दृष्टिकोण (वे ईसीएमएस्क्रिप्ट फिफ्थ एडिशन के सख्त मोड में दोनों को अस्वीकार कर दिया गया है);
  • यदि आपको एक का उपयोग करना है, new Functioneval के लिए बेहतर है, जब तक कि आपको कॉलिंग फ़ंक्शन के स्थानीय चरों तक पहुंचने के लिए वास्तव में कोड की आवश्यकता न हो। `दुर्भावनापूर्ण कोड अभी भी निष्पादित किया जाता है;
3

http://www.json.org/js.html

eval समारोह बहुत तेजी से है। हालांकि, यह संकलित और किसी भी जावास्क्रिप्ट प्रोग्राम निष्पादित कर सकता है, इसलिए सुरक्षा समस्याएं हो सकती हैं। eval का उपयोग इंगित किया जाता है जब स्रोत विश्वसनीय और सक्षम है। JSON पार्सर का उपयोग करना अधिक सुरक्षित है। XMLHttpRequest पर वेब अनुप्रयोगों में, संचार को केवल उसी मूल तक अनुमति दी जाती है जो उस पृष्ठ को प्रदान करती है, इसलिए यह विश्वसनीय है। लेकिन यह सक्षम नहीं हो सकता है। यदि सर्वर अपने JSON एन्कोडिंग में कठोर नहीं है, या यदि यह अपने सभी इनपुट को सावधानी से मान्य नहीं करता है, तो यह खतरनाक स्क्रिप्ट ले जा सकता है, जो अवैध JSON टेक्स्ट वितरित कर सकता है। Eval function स्क्रिप्ट को निष्पादित करेगा, इसकी दुर्भाग्य को मुक्त करेगा।

सुरक्षित के साथ आपका क्या मतलब है? कम से कम दुर्भावनापूर्ण कोड निष्पादित नहीं है;)

यह भी देखें: Alternatives to JavaScript eval() for parsing JSON

एक और मुद्दा हो सकता है, कि new Function() एक little fastereval से माना जाता है।

अद्यतन:

आप मूल रूप से comments on jQuery's .parseJSON() function में एक ही तर्क के बारे में पढ़ सकते हैं।

+0

एक अजीब सवाल = के लिए एक अच्छा जवाब की तरह लगता है करता है) –

+5

लेकिन' नया समारोह() के साथ है। –

+4

यह एक अच्छा जवाब कैसा है? लुका जानना चाहता था कि कैसे 'eval'' नए फंक्शन (...) 'से अलग है, और यह कहता है कि' eval' के साथ क्या गलत है। – Gabe

11

क्यों jQuery विशेष रूप से new Function() का उपयोग करता है के रूप में, John Resig answered this on the jQuery forums

eval का उपयोग के बाद से यह स्पष्ट नहीं है कि क्या eval में क्रियान्वित किया जा सकता है कोड minifiers के लिए समस्याओं के सभी प्रकार का कारण बनता है। उस दौड़ से आखिरी नतीजों को देखते हुए ऐसा लगता है कि नया फंक्शन काफी हद तक बराबर है और कभी-कभी थोड़ा तेज भी होता है। एक अपवाद सफारी 4 था - लेकिन उन परिणामों की तारीख है, सफारी 4 देशी JSON.parse कार्यान्वयन के साथ भेज दिया गया है, जिसका हम उपयोग करते हैं।

संबंधित मुद्दे