2009-06-03 14 views
16

पार्सिंग के लिए जावास्क्रिप्ट eval() के विकल्प त्वरित प्रश्न। जावास्क्रिप्ट में Eval असुरक्षित है ना? मैं एक स्ट्रिंग के रूप एक JSON ऑब्जेक्ट है और मैं तो मैं डेटा प्राप्त कर सकते हैं यह एक वास्तविक वस्तु में बदल जाने की जरूरत है:जेएसओएन

function PopulateSeriesFields(result) 
{ 
    data = eval('(' + result + ')'); 
    var myFakeExample = data.exampleType 
} 

यह मदद करता है मैं jQuery से $ .ajax विधि का उपयोग कर रहा है।

धन्यवाद

+0

मैं यहाँ एक समान प्रश्न पूछा: http://stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead – karlipoppins

उत्तर

25

ठीक है, सुरक्षित है या नहीं, जब आप jQuery का उपयोग कर रहे हैं, तो आप बेहतर कर रहे हैं $.getJSON() विधि, नहीं $ .ajax() का उपयोग करने के लिए:

$.getJSON(url, function(data){ 
    alert(data.exampleType); 
}); 

eval() आमतौर पर JSON पार्स के लिए सुरक्षित माना जाता है जब आप केवल आपके स्वयं के सर्वर से संचार कर रहे हैं और विशेष रूप से जब आप सर्वर की ओर एक अच्छी JSON लाइब्रेरी का उपयोग करते हैं जो गारंटी देता है कि उत्पन्न जेएसओएन में कुछ भी बुरा नहीं होगा।

यहां तक ​​कि डगलस Crockford, JSON के लेखक ने कहा है कि आप अपने कोड में कहीं भी eval() उपयोग नहीं करना चाहिए, JSON को पार्स करने को छोड़कर। संबंधित पुस्तक JavaScript: The Good Parts

+1

मैं वही चीज़ लिख रहा था जो +1 –

+0

है और अब मैं इसे देखता हूं .. – Damien

+17

"getJSON" डेटा के साथ $ .ajax का उपयोग करने जैसा ही है 'json' के प्रकार टाइप करें ... – James

5

असुरक्षित? यह इस बात पर निर्भर करता है कि क्या आप डेटा पर भरोसा कर सकते हैं।

यदि आप भरोसा कर सकते हैं कि स्ट्रिंग JSON होगी (और इसमें शामिल नहीं होगा, उदाहरण के लिए, फ़ंक्शंस) तो यह सुरक्षित है।

उसने कहा - यदि आप jQuery का उपयोग कर रहे हैं, तो आप इसे मैन्युअल रूप से क्यों कर रहे हैं? यह निर्दिष्ट करने के लिए dataType विकल्प का उपयोग करें कि यह JSON है और लाइब्रेरी को आपके लिए इसका ख्याल रखने दें।

+1

jQuery का उपयोग करती eval ... – James

+2

@ जेपी: लेकिन केवल अगर JSON उपलब्ध नहीं है। http://dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504 – Gumbo

+0

मेरे पास डेटा टाइप प्रकार है लेकिन यह अभी भी एक स्ट्रिंग के रूप में वापस आता है। रुको, मैं एप्लिकेशन/JSON – Damien

3

जावास्क्रिप्ट eval का उपयोग असुरक्षित है। चूंकि जेएसओएन सिर्फ जावास्क्रिप्ट का सबसेट है लेकिन जावास्क्रिप्ट किसी वैध जावास्क्रिप्ट को अनुमति देता है।

इसके बजाय JSON parser from json.org जैसे वास्तविक JSON पार्सर का उपयोग करें।

3

कोड का मूल्यांकन करने का विकल्प इसे मैन्युअल रूप से पार्स करना है। यह उतना कठिन नहीं है जितना लगता है लेकिन रनटाइम पर यह काफी भारी है। You can read about it here.

ध्यान देने योग्य महत्वपूर्ण हिस्सा जेएसओएन का मूल्यांकन स्वाभाविक रूप से असुरक्षित नहीं है। जब तक आप स्रोत पर भरोसा करते हैं कि चीजों को गेंदबाजी न करें। इसमें यह सुनिश्चित करना शामिल है कि जेएसओएन एन्कोडर में गुजरने वाली चीजें ठीक से बच गई हैं (लोगों को आपके उपयोगकर्ताओं की मशीनों पर स्ट्रीम निष्पादित कोड को 2 चरणों को रोकने के लिए)।

6

यदि आप स्रोत पर भरोसा नहीं कर सकते हैं, तो आप सही हैं ... eval असुरक्षित है। इसका उपयोग आपके पृष्ठों में कोड इंजेक्ट करने के लिए किया जा सकता है। एक सुरक्षित विकल्प के लिए इस लिंक बाहर

की जांच:

JSON in Javascript

पेज बताता है कि क्यों eval असुरक्षित है और पृष्ठ के तल पर एक JSON पार्सर के लिए एक लिंक प्रदान करता है।

19

में संबंधित अनुभाग देखें, आपको JSON का उपयोग करना चाहिए और JSON.parse लिखें।

"मैन्युअल" पार्स बहुत धीमी गति से, पुस्तकालय चेकों सामान से तो JSON.parse कार्यान्वयन है और फिर eval का उपयोग कर समाप्त होता है, तो यह still unsafe है। लेकिन, यदि आप एक नए ब्राउज़र (आईई 8 या फ़ायरफ़ॉक्स) का उपयोग कर रहे हैं, तो पुस्तकालय कोड वास्तव में निष्पादित नहीं किया जाता है।इसके बजाए, मूल ब्राउज़र समर्थन इसमें शामिल है, और फिर आप सुरक्षित हैं।

here अधिक से here पढ़ें।

+0

http://code.google.com/p/json-sans-eval/ एक मैनुअल पार्सर है जिसका लक्ष्य तेज़ और सुरक्षित होना है। आप सही हैं कि मूल समर्थन को प्राथमिकता दी जानी चाहिए जहां उपलब्ध हो। –

4

आप, jQuery उपयोग कर रहे हैं संस्करण 1.4.1 के रूप में आप jQuery.parseJSON() का उपयोग कर सकते

इस जवाब देखें: Safe json parsing with jquery?

2

आप इसे इस

var object = new Function("return " + jsonString)() 
+1

यह केवल एक eval उपनाम है। –

+2

(मजाकिया, मैंने इसे पहले स्कैन पर 'बुराई उपनाम' के रूप में पढ़ा :-) –

+0

अर्थात्, कोई अंतर नहीं है। –

0

की तरह कोशिश कर सकते हैं एक और शानदार विकल्प है यूयूआई: http://yuilibrary.com/yui/docs/json/

तो आपका कोड कुछ ऐसा होगा:

Y.JSON.parse('{"id": 15, "name": "something"}'); 
संबंधित मुद्दे