2010-03-23 13 views
7

पार्स करने के लिए जावास्क्रिप्ट eval का उपयोग करना प्रश्न: मैं अपने वेबमाइड्स में से एक से JSON रिटर्न वैल्यू को पार्स करने के लिए eval का उपयोग कर रहा हूं।

मैं jquery-json जोड़ना पसंद नहीं करता क्योंकि स्थानांतरण मात्रा पहले से काफी बड़ी है। तो मैं eval के साथ JSON वापसी मान पार्स।
अब अफवाहें चलती हैं कि यह असुरक्षित है। क्यूं कर ?

कोई भी जेएसओएन रिटर्न वैल्यू को संशोधित नहीं कर सकता है जब तक कि वे मेरे सर्वर को हैक नहीं करते हैं, इस मामले में मुझे वैसे भी बड़ी समस्या होगी।

और यदि वे इसे स्थानीय रूप से करते हैं, तो जावास्क्रिप्ट केवल अपने ब्राउज़र में निष्पादित होता है।
तो मैं यह देखने में असफल रहा कि समस्या कहां है।

क्या कोई इस ठोस उदाहरण का उपयोग करके इस पर कुछ प्रकाश डाल सकता है?जेएसओएन

function OnWebMethodSucceeded(JSONstrWebMethodReturnValue) 
{ 
    var result=eval('(' + JSONstrWebMethodReturnValue + ')') 
    ... // Adding result.xy to a table 
} 

उत्तर

14

मौलिक मुद्दा यह है कि eval, किसी भी JavaScript चला सकें सिर्फ JSON- प्रारूपित डेटा deserialize नहीं है। एक अविश्वसनीय या अर्ध-विश्वसनीय स्रोत से JSON को संसाधित करने के लिए इसका उपयोग करते समय यह जोखिम है। जेएसओएन को कोष्ठक में लपेटने की लगातार चाल यह सुनिश्चित करने के लिए पर्याप्त नहीं है कि मनमानी जावास्क्रिप्ट निष्पादित नहीं किया गया है। इस "JSON" पर विचार करें जो वास्तव में नहीं है:

function(){alert('Hi')})(

यदि आप था कि एक चर x में और ऐसा किया:

var result = eval("(" + x + ")"); 

... आपको एक अलर्ट दिखाई देंगे - जावास्क्रिप्ट भाग गया। सुरक्षा का मसला।

यदि आपका डेटा किसी विश्वसनीय स्रोत से आ रहा है (और ऐसा लगता है), तो मैं इसके बारे में ज्यादा चिंता नहीं करता। उस ने कहा, आपको क्रॉकफोर्ड की चर्चा here (क्रॉकफोर्ड जेएसओएन का आविष्कारक और आम तौर पर जानकार जावास्क्रिप्ट व्यक्ति) में रुचि हो सकती है। क्रॉकफ़ोर्ड कम से कम तीन सार्वजनिक डोमेन पार्सर्स को this page पर भी प्रदान करता है, आप इसका उपयोग करने पर विचार कर सकते हैं: उसका json2.js पार्सर और स्ट्रिंगफायर, जो मिनीफाइड आकार में केवल 2.5k है, लेकिन जो अभी भी eval का उपयोग करता है (यह पहले कई सावधानी बरतता है); उसका json_parse.js, जो एक रिकर्सिव-डेसेंट पार्सर है जो eval का उपयोग नहीं कर रहा है; और उसका json_parse_state.js, एक राज्य मशीन पार्सर (फिर से eval का उपयोग नहीं कर रहा है)। तो आप अपने जहर लेने के लिए मिलता है। (उन पिछले दो विकल्प उनका कहना है के लिए Camilo Martin को प्रोत्साहित करें।)

+4

यह ध्यान दिया जाना चाहिए कि क्रॉकफोर्ड के JSON में दो अन्य पुस्तकालय शामिल हैं (मुख्य json.js और json2.js के अलावा) विभिन्न पार्सिंग मोड के साथ जो 'eval' का उपयोग नहीं करते हैं। वे 'json_parse.js' और' json_parse_state.js' हैं और यहां पाए जा सकते हैं [https://github.com/douglascrockford/JSON-js/) –

+0

@ कैमिलो: बढ़िया, इसके लिए धन्यवाद! –

+0

क्या यह कहना ठीक है कि मेरे पास बाहरी स्रोत से कोई इनपुट नहीं है, मैं सुरक्षित रूप से eval का उपयोग कर सकता हूं? –

4

तेजी से, JSON पार्स और एन्कोडिंग आधुनिक ब्राउज़रों में मूल रूप से उपलब्ध है, [wikipedia reference] यह एक अतिरिक्त पुस्तकालय लोड करने के लिए की जरूरत के बिना अपने आवेदन सुरक्षित JSON कार्यक्षमता देता है ।

आप कुछ इस तरह करने से देशी JSON समर्थन के लिए परीक्षण कर सकते हैं: एक framewok के माध्यम से

var native_JSON_exists = typeof window.JSON === 'object'; 

आप (ऊपर टीजे Crowder से जुड़े हुए,) डगलस Crockford की तरह एक JSON पार्स पुस्तकालय लोड करना चाहिए या कार्यक्षमता उपलब्ध उन ब्राउज़रों के लिए जिनके पास मूल समर्थन नहीं है। (लेकिन कम से कम उपयोगकर्ताओं को आधुनिक ब्राउज़रों के लिए भाग्यशाली उपयोगकर्ताओं की रक्षा करने के लिए इसका समर्थन करने वाले ब्राउज़र में मूल JSON का उपयोग करना चाहिए)

ध्यान रखें, JSON जावास्क्रिप्ट के सिंटैक्स का सबसेट है, इसलिए एक स्ट्रिंग जो जावास्क्रिप्ट eval कथन में काम कर सकती है उचित JSON पार्सिंग में काम नहीं करते हैं।आप JSLint (http://www.jslint.com/) का उपयोग कर त्रुटियों के लिए अपने JSON स्ट्रिंग का परीक्षण कर सकते हैं।

+1

+1 दुख की बात है, हालांकि, मूल समर्थन अभी तक प्राइम टाइम के लिए तैयार नहीं है; बहुत अधिक कार्यान्वयन कीड़े (आश्चर्यजनक रूप से)। लेकिन यह वहां जाएगा। –

+0

@ टीजे। पाउडर क्या बग? –

+0

@ कैमिलो: उदाहरण के लिए [यह एक] है (http://stackoverflow.com/questions/1288962/ie8-native-json-parse-bug-causes-stack-overflow)। मुझे यकीन है कि मैंने दूसरों के बारे में प्रोटोटाइप और jQuery पुस्तकालयों में शामिल लोगों से टिप्पणियां सुनाई हैं (और न केवल आईई में)। निकट अवधि में, मुझे लगता है कि मैं शायद json2.js या (यदि मैं अविश्वसनीय या अर्द्ध-विश्वसनीय स्रोत से डेटा पार्स कर रहा हूं) तो गैर-eval json_parse.js और json_parse_state.js विकल्पों को आपने इंगित किया है क्रॉकफ़ोर्ड का [गीथब पेज] (https://github.com/douglascrockford/JSON-js/)। –

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