2013-08-12 7 views
7

कई डेवलपर्स का मानना ​​है कि जावास्क्रिप्ट की eval() विधि से बचा जाना चाहिए। यह विचार एक डिजाइन परिप्रेक्ष्य से समझ में आता है। जब इसे सरल, बेहतर विकल्प उपलब्ध होता है तो इसे अक्सर बदसूरत कामकाज के रूप में उपयोग किया जाता है।जावास्क्रिप्ट के eval() विधि का पता लगाने

हालांकि, मैं सुरक्षा भेद्यता के बारे में चिंताओं को समझ नहीं पा रहा हूं। निश्चित रूप से, eval() चल रहा हैकर हैकर को आपके द्वारा चलाए जा सकने वाले किसी भी जावास्क्रिप्ट कोड को चलाने की क्षमता देता है।

लेकिन क्या वे वैसे भी ऐसा नहीं कर सकते हैं? क्रोम में, कम से कम, डेवलपर टूल अंत उपयोगकर्ता को अपनी जावास्क्रिप्ट चलाने की अनुमति देते हैं। डेवलपर टूल्स की तुलना में eval() अधिक खतरनाक कैसे है?

+2

यह * "आम सहमति" * नहीं है। कई अनुभवी डेवलपर्स एफयूडी द्वारा 'eval' के बारे में नाराज हैं। * "Eval बुरा है" * शायद अनुभवी कोडर द्वारा आज कभी नहीं कहा जाता है। यदि आप बेवकूफ हैं, तो यह खतरनाक हो सकता है। लेकिन आम तौर पर यह धीमा, बदसूरत और कोड विकसित करने के लिए कड़ी मेहनत कर रहा है। –

+0

अब, मुझे नहीं पता कि यह प्रश्न कैसे एक अच्छा जवाब प्राप्त कर सकता है ... –

उत्तर

11

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

eval() का खतरा यह है कि जब इसे अनुचित मूल्यों पर निष्पादित किया जाता है, और DOM Based XSS भेद्यता का कारण बन सकता है।

उदा। अपने HTML में निम्न कोड पर विचार (बल्कि काल्पनिक है, लेकिन यह मुद्दा मुझे आशा है कि यह दर्शाता है)

<script> 

eval('alert("Your query string was ' + unescape(document.location.search) + '");'); 

</script> 

अब अगर क्वेरी स्ट्रिंग ?foo है तो आप बस बताते हुए एक चेतावनी संवाद मिल निम्नलिखित: Your query string was ?foo

लेकिन क्या यह कोड उपयोगकर्ता को करने की अनुमति देगा उपयोगकर्ताओं को उनकी साइट से http://www.example.com/page.htm?hello%22);alert(document.cookie+%22 पर रीडायरेक्ट करेगा, जहां www.example.com आपकी वेबसाइट है।

इस कोड है कि

alert("Your query string was hello"); 
alert(document.cookie+""); 

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

यह उपयोगकर्ता/बाहरी इनपुट से किसी भी मूल्य पर लागू होता है जो eval() में सीधे अनियंत्रित और निष्पादित होता है, न केवल यहां क्वेरी स्ट्रिंग के रूप में।

+0

यह समझ में आता है। मैं सोच रहा था कि अन्य साइटों को उपयोगकर्ता डेटा को स्क्रैप करने की इजाजत देने के बजाय 'eval()' को वेबसाइट में हैकिंग की अनुमति है। –

+0

सीधे नहीं, लेकिन यह तब कर सकता है जब कोई व्यवस्थापक उपयोगकर्ता लक्षित किया गया हो। – SilverlightFox

2

किसी हमलावर के पास उपयोगकर्ता के ब्राउज़र के डेवलपर टूल तक पहुंच नहीं है। हमलावर संभवतः उपयोगकर्ता कंप्यूटर पर बैठा नहीं है।

eval() का खतरा यह है कि एक हमलावर डेटा को कुशलतापूर्वक उपयोग करने में सक्षम हो सकता है जो अंततः eval() के माध्यम से अन्य तरीकों से चलाया जा सकता है। यदि eval() 'डी स्ट्रिंग HTTP कनेक्शन से आता है, तो हमलावर एक एमआईटीएम हमला कर सकता है और स्ट्रिंग को संशोधित कर सकता है। यदि स्ट्रिंग बाहरी संग्रहण से आती है, तो हमलावर ने उस संग्रहण स्थान में डेटा का उपयोग किया हो सकता है। आदि

+2

असली समस्या यह है कि उपयोगकर्ता द्वारा प्रदान किए गए किसी भी स्रोत से स्ट्रिंग आ रही है।'Eval' के संबंध में एमआईटीएम हमला हमेशा एक समस्या होगी। अगर वे एमआईटीएम कर रहे हैं, तो वे आसानी से नियमित रूप से गैर-विकसित जेएस पेलोड को संशोधित कर सकते हैं। – Matt

+1

एक और क्लासिक उदाहरण 'eval'ing GET चर है XSS छेद खोलने का एक आसान तरीका है। आदि –

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