2011-07-20 11 views
10

मुझे लगता है कि JSON.parse() एक हमलावर को जावास्क्रिप्ट को प्रतिक्रिया में इंजेक्शन देने से रोकता है क्योंकि एक JSON पार्सर केवल एक पाठ पार्सर है, स्क्रिप्ट पार्सर नहीं है, इसलिए कृपया इसे बंद न करें अन्य सभी प्रश्नों का एक डुप्लिकेट है उसके बारे में। यह एक अलग सवाल है।JSON.parse() eval() से वास्तव में सुरक्षित है जब वेब पेज और AJAX कॉल उसी सर्वर से आते हैं?

यदि कोई हमलावर आपके अजाक्स कॉल को हाइजैक कर सकता है और अजाक्स कॉल में जावास्क्रिप्ट डाल सकता है, तो वे आपके वास्तविक वेबपृष्ठ को हाइजैक करने में सक्षम नहीं होंगे और आपके पृष्ठ में मनमाने ढंग से जावास्क्रिप्ट डालने की संभावना है, जिससे वे एक ही हमले को पूरा कर सकते हैं ?

निश्चित रूप से, आपके पास eval() के बजाय JSON.parse() का उपयोग करके खोने के लिए कुछ भी नहीं है (जब तक आपके पास अपने पर्यावरण में अभी तक JSON पार्सर नहीं है और उसे प्राप्त करने के लिए और कोड जोड़ना है), लेकिन क्या यदि आपके वेब पेज को आपके एजेक्स कॉल के समान होस्ट द्वारा सेवा दी जा रही है तो क्या स्थिति वास्तव में सुरक्षा जोड़ती है?

+3

मुझे आश्चर्य है कि यह [आईटी सुरक्षा स्टैक एक्सचेंज] (http://security.stackexchange.com) पर है या नहीं? –

+3

मैंने इसे यहां रखा क्योंकि यह वह जगह है जहां हर कोई जो कोड का एक टुकड़ा पोस्ट करता है जो eval() का उपयोग करता है, यह कितना असुरक्षित है। – jfriend00

उत्तर

9

हां, यह वास्तव में सुरक्षित है। आप जो भी सावधानी बरतते हैं वह संभावित शोषण का एक सेट है जिसे आप नहीं रोकते हैं।

एक हमलावर आपके सर्वर के आउटपुट पर पूरी तरह से इसे बदलने में सक्षम होने के बिना कुछ नियंत्रण प्राप्त करने में सक्षम हो सकता है। कोई भी यह सुझाव नहीं दे रहा है कि यह एक जादू बुलेट है, लेकिन यह संभावित रूप से तेज़ है और आप संभावित भेद्यता नहीं बना रहे हैं जो आपको वापस आ सकता है और आपको चोट पहुंचा सकता है।

हो सकता है कि किसी को अपने सर्वर एक बुरा दिन है, और unsanitized उपयोगकर्ता इनपुट श्रृंखलाबद्ध द्वारा JSON के निर्माण की तरह कुछ मूर्ख करता है चल रहा है:

<?php 
    print '{"foo": ' . $_GET['bar'] . '}'; 
?> 

आप JSON.parse उपयोग कर रहे हैं, सबसे खराब वे क्या कर सकते हैं एक धक्का है आपकी स्मृति में बड़ी वस्तु। यदि आप eval का उपयोग कर रहे हैं तो वे सबकुछ अपहरण कर सकते हैं।

+0

+1 का उदाहरण प्रदान करने के लिए कि 'JSON.parse' वास्तव में ओपी के मूल चश्मे के बाद अधिक सुरक्षित है। –

+0

ठीक है, हमारे पास अब तक एक उदाहरण है कि एक हड्डी का व्यवस्थापक प्रशासक आपके AJAX प्रतिक्रिया को इस तरह से गड़बड़ कर देता है जो कि किसी भी तरह से जावास्क्रिप्ट और खतरनाक है। – jfriend00

+0

JSON.parse() eval() से तेज क्यों है? क्या आप कह रहे हैं कि जावास्क्रिप्ट में JSON को पार्स करना eval() के पीछे दुभाषिया इंजन से तेज़ है? – jfriend00

2

ठीक है, अगर वे आपके AJAX प्रतिक्रियाओं में इंजेक्ट करने में सक्षम हैं, तो संभवतः वे पहले से ही सफलतापूर्वक मैन-इन-द-मिडल में आपको एक तरफ या दूसरे (एआरपी, डीएनएस या कुछ और) में सफलतापूर्वक प्रबंधित कर चुके हैं।

इस प्रकार के हमले के बारे में अधिक जानकारी के लिए http://en.wikipedia.org/wiki/Man-in-the-middle_attack देखें।

आप उसमें सही हैं, अगर वे आपके AJAX प्रतिक्रिया में इंजेक्ट कर सकते हैं, तो वे पूरे पृष्ठों को भी इंजेक्ट कर सकते हैं। असल में, जो कुछ भी आपको मिलता है या नेटवर्किंग के माध्यम से भेजता है अब एमटीएम में कमजोर है जब तक कि एचटीटीपीएस \ एसएसएल जैसे कुछ इस्तेमाल नहीं किया जा रहा है।

1

यह एक बहुत अच्छा मुद्दा है। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि JSON.parse को eval से तेज़ होने का अवसर मिलेगा।

ब्राउज़र में पहले से ही HTML/जावास्क्रिप्ट कैश किया गया है और सर्वर Cache-Control का उपयोग करने के लिए सर्वर को पुनः लोड करने की आवश्यकता नहीं है, तो बहुत कम संभावना है। यदि ऐसा होता है तो निश्चित रूप से एक व्यक्ति को अवरोध करने के लिए पृष्ठ को संशोधित करने का मौका नहीं होगा। लेकिन यह परिस्थितियों का एक दुर्लभ सेट है। संभावना है कि, आपको ब्राउज़र/एचटीएमएल/जावास्क्रिप्ट का एक नया संस्करण देखने के लिए ब्राउजर की आवश्यकता होगी जो डिफ़ॉल्ट व्यवहार है।

सुरक्षा अंतर के लिए, मुझे लगता है कि आप सही हैं।

मेरे लिए, मैं केवल HTTPS पुष्टि प्रणाली के साथ काम करता हूं। लेकिन मेरे पास एक ऐसा फ़ंक्शन है जो उपलब्ध होने पर JSON.parse का उपयोग करता है और गति सुधार के लिए eval पर वापस आ जाता है।

0

अच्छा ...मैं eval के उपयोग की वकालत नहीं कर रहा हूं, लेकिन मुझे नहीं लगता कि यह जावास्क्रिप्ट में सुरक्षा समस्या का गठन करता है, क्योंकि जावास्क्रिप्ट क्लाइंट-साइड भाषा है। यदि आप अपने कोड में eval का उपयोग नहीं करते हैं, तो मुझे कंसोल या पता बार में javascript:my_own_evil_code() चलाने से रोकता है? यह जावास्क्रिप्ट है, मैं अपना कोड चला सकता हूं या अपना संशोधित कर सकता हूं, अपने स्वयं के HTTP अनुरोध बना सकता हूं और HTTP प्रतिक्रियाओं के साथ कुछ भी कर सकता हूं, या अपने कार्यों में अपना खुद का eval भी जोड़ सकता हूं।

आप eval उपयोग नहीं करना चाहिए अगर वहाँ एक और तुलनीय समाधान उपलब्ध है, लेकिन अगर आप, सिर्फ सादगी के लिए, eval('('+jsonstring+')') क्या करना JSON.parse का अनुकरण करना चाहते हैं, मुझे नहीं लगता कि यह एक बड़ी गलती है।

+2

यह उपयोगकर्ता के अपने कोड में कोड चलाने के बारे में नहीं है। यह आपके पृष्ठ में एक बाहरी हमलावर इंजेक्शन कोड के बारे में है। तो ... पता बार उदाहरण वास्तव में यह नहीं है कि यह क्या है। उपकरण के सभी प्रकार हैं (जैसे GreaseMonkey) जो आपके अपने पृष्ठों में अतिरिक्त कोड चलाने में आपकी सहायता करने के लिए एकमात्र उद्देश्य है। उपयोगकर्ता को ऐसा करने की अनुमति है। – jfriend00

+2

@ jfriend00 कृपया, अधिक विशिष्ट हो। यदि कोई हमलावर कुछ कोड इंजेक्ट करने में सक्षम होता है, तो यह पहले से ही एक बड़ा सुरक्षा छेद है, इससे कोई फर्क नहीं पड़ता कि स्रोत में 'eval' है या नहीं। उदाहरण के लिए, यदि कोई हमलावर 'XMLHttpRequest' द्वारा बनाए गए HTTP अनुरोध की प्रतिक्रिया को संशोधित कर सकता है, तो वह मुख्य फ़ाइल (w/जावास्क्रिप्ट) को भी संशोधित कर सकता है और इस प्रकार अपना कोड चला सकता है। मुझे पूरा यकीन है कि अगर आप हमें हमलावर के कोड को चलाने के लिए 'eval' का उपयोग करने का कोई मामला दिखाते हैं, तो मैं आपको यह भी दिखाऊंगा कि बिना' eval' के इसे कैसे किया जाए। – duri

+0

यह मेरा मुद्दा भी है। चूंकि अधिकतर हमले जो एजेक्स प्रतिक्रिया को संशोधित करने में सक्षम होंगे, वे मेजबान पृष्ठ को पहले स्थान पर संशोधित कर सकते हैं (सीधे अपने स्वयं के जेएस इंजेक्शन कर रहे हैं), AJAX प्रतिक्रिया की सुरक्षा आपको बहुत अधिक नहीं खरीद रही है। एक दरवाजे पर एक डबल लॉक डालना जब सभी अन्य दरवाजे में केवल एक ताले होते हैं तो आपको अतिरिक्त सुरक्षा नहीं मिलती है, खासकर जब खिड़कियां बहुत सुरक्षित नहीं होती हैं। – jfriend00

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