दिलचस्प पोस्ट
FixedThreadPool vs CachedThreadPool: कम दो बुराइयों का रेलिंग 4 link_to आरंभिक ट्यूटोरियल में काम नहीं कर रहा है सूची को हाइलाइट करें चयनित पंक्ति देखें div ऊर्ध्वाधर संरेखित मध्य सीएसएस नेस्टेड लूपों को तोड़कर पायथन: एक सूची में वस्तुओं की गिनती करने के लिए एक शब्दकोश का उपयोग करना आर में स्टैक्ड बार प्लॉट WPF न्यूमेरिक अपडाउन नियंत्रण कहां है? कैसे एक x264 सी एपीआई का उपयोग कर H264 में छवियों की श्रृंखला को एक सांकेतिक शब्दों में बदलना है? स्थिर तरीके धागे सुरक्षित हैं वेब से मार्केट ऐप लॉन्च करने के लिए आशय का उपयोग करने के लिए Android ऐप्स के लिए पैकेज नाम ढूंढें एंड्रॉइड – बिटमैप बनाते समय मेमोरी अपवाद से बाहर चित्र घूम रहा है एनीमेशन सूची या एनिमेटेड घुमाएगी? (एंड्रॉयड) सुपरक्लाइस "javax.servlet.http.HttpServlet" जावा बिल्ड पथ पर नहीं मिला था जावास्क्रिप्ट में कई पंक्तियों में एक लंबी नियमित अभिव्यक्ति कैसे विभाजित है?

क्यों जावास्क्रिप्ट eval समारोह का उपयोग कर एक बुरा विचार है?

ईवाल फ़ंक्शन, गतिशील रूप से कोड उत्पन्न करने का एक शक्तिशाली और आसान तरीका है, तो क्या चेतावनियां हैं?

Solutions Collecting From Web of "क्यों जावास्क्रिप्ट eval समारोह का उपयोग कर एक बुरा विचार है?"

  1. Eval का अनुचित उपयोग इंजेक्शन हमलों के लिए आपके कोड को खोलता है

  2. डीबगिंग अधिक चुनौतीपूर्ण हो सकती है (कोई लाइन नंबर नहीं, आदि)

  3. eval'd कोड धीमा कार्यान्वित (कोई संकलन / कैश eval'd कोड का अवसर)

संपादित करें: जैसा कि जेफ वाल्डेन टिप्पणी में बताते हैं, # 3 कम से कम 2008 में आज की तुलना में कम सच है। हालांकि, संकलित लिपियों के कुछ कैशिंग होने पर यह केवल उन लिपियों तक ही सीमित हो सकता है जो कि कोई बदलाव नहीं किया गया है। एक अधिक संभावना परिदृश्य यह है कि आप स्क्रिप्ट्स का विकास कर रहे हैं, जो हर बार थोड़े बदलाव से गुजर चुके हैं और जैसे कैश नहीं किया जा सकता। चलो बस कहना है कि कुछ eval'd कोड धीरे धीरे क्रियान्वित करता है।

eval हमेशा बुरा नहीं है ऐसे समय होते हैं जहां यह बिल्कुल उपयुक्त होता है।

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

वेरिएबल 'आलू' में संग्रहीत आईडी के साथ एक तत्व का रंग सेट करने के लिए, एक सर्व-विशिष्ट-विशिष्ट उदाहरण देने के लिए:

 eval('document.' + potato + '.style.color = "red"'); 

अगर ऊपर दिए गए कोड के लेखकों को जावास्क्रिप्ट ऑब्जेक्ट्स की बुनियादी चीजों के बारे में एक सुराग मिला है, तो उन्हें यह एहसास हो गया होगा कि स्क्वायर ब्रैकेट्स का प्रयोग शाब्दिक बिंदु-नामों के बजाय इस्तेमाल किया जा सकता है, जो कि eval की आवश्यकता पर अतिक्रमण कर रहा है:

 document[potato].style.color = 'red'; 

… जो पढ़ने के लिए बहुत आसान है और साथ ही कम संभावित बग़ी

(लेकिन फिर, कोई व्यक्ति जो / वास्तव में / जानता था कि वे क्या कर रहे थे कहेंगे:

 document.getElementById(potato).style.color = 'red'; 

जो दस्तावेज़ ऑब्जेक्ट से सीधे DOM तत्वों तक पहुंचने की पुरानी चाल की तुलना में अधिक विश्वसनीय है।)

मेरा मानना ​​है कि यह किसी स्ट्रिंग से किसी भी जावास्क्रिप्ट फंक्शन को निष्पादित कर सकता है। इसका उपयोग करना लोगों के लिए आवेदन में दुष्ट कोड को शामिल करना आसान बनाता है।

दो अंक दिमाग में आते हैं:

  1. सुरक्षा (लेकिन जब तक आप खुद को मूल्यांकन करने के लिए स्ट्रिंग उत्पन्न करते हैं, यह एक गैर-मुद्दा हो सकता है)

  2. निष्पादन: जब तक कोड निष्पादित नहीं किया जाता अज्ञात है, यह अनुकूलित नहीं किया जा सकता। (जावास्क्रिप्ट और प्रदर्शन के बारे में, निश्चित रूप से स्टीव यिग्ज की प्रस्तुति )

उत्कर्ष () को उपयोगकर्ता इनपुट उत्तीर्ण करना एक सुरक्षा जोखिम है, लेकिन eval () के प्रत्येक आमंत्रण से JavaScript इंटरप्रेटर के एक नए उदाहरण का निर्माण होता है यह एक स्रोत होग हो सकता है

यह आमतौर पर केवल एक समस्या है अगर आप eval उपयोगकर्ता इनपुट गुजर रहे हैं

मुख्य रूप से, बनाए रखने और डिबग करने के लिए यह बहुत मुश्किल है यह एक goto की तरह है आप इसे उपयोग कर सकते हैं, लेकिन इससे उन लोगों पर समस्याएं और कठिन लगना मुश्किल हो जाता है, जिन्हें बाद में परिवर्तन करने की आवश्यकता हो सकती है

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

 eval('al' + 'er' + 't(\'' + 'hi there!' + '\')'); 

इसलिए यदि आप कुछ जावास्क्रिप्ट कोड को चलाने के लिए देख रहे हैं जहां यह अन्यथा अनुमति नहीं हो सकती है ( माइस्पेस , मैं आपको देख रहा हूँ …) तो eval () एक उपयोगी चाल हो सकती है

हालांकि, उपर्युक्त सभी कारणों के लिए, आपको इसे अपने खुद के कोड के लिए उपयोग नहीं करना चाहिए, जहां आपके पास पूर्ण नियंत्रण है – यह जरूरी नहीं है, और 'ट्रिपी जावास्क्रिप्ट हैक्स' शेल्फ़ को बेहतर ढंग से चलाया जा रहा है।

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

शेष उत्तरों के साथ, मुझे नहीं लगता कि eval स्टेटमेंट्स को उन्नत कम से कम किया जा सकता है

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

यह काफी उपयोगी है, यद्यपि, और मॉडरेशन के साथ प्रयोग में बहुत अच्छी कार्यक्षमता जोड़ सकते हैं

जब तक आप 100% सुनिश्चित नहीं कर रहे हैं कि मूल्यांकित किया जा रहा कोड विश्वसनीय स्रोत (आमतौर पर आपका खुद का आवेदन) है, तो यह आपके सिस्टम को क्रॉस-साइट स्क्रिप्टिंग हमले में उजागर करने का एक निश्चित तरीका है।

मुझे पता है कि यह चर्चा पुरानी है, लेकिन मैं वास्तव में इस दृष्टिकोण को Google की तरह पसंद करता हूं और दूसरों के साथ उस भावना को साझा करना चाहता हूं;)

दूसरी बात यह है कि जितना बेहतर होगा उतना आपको समझने की कोशिश करेंगे और आखिरकार आपको विश्वास नहीं होता कि कुछ अच्छा या बुरा है क्योंकि किसी ने ऐसा कहा है 🙂 यह एक बहुत ही प्रेरणादायक वीडियो है जिससे मुझे अपने द्वारा और अधिक सोचने में मदद मिली 🙂 अच्छा व्यवहार अच्छा है, लेकिन उन्हें दिमाग का उपयोग न करें 🙂

यह सुरक्षा के बारे में आत्मविश्वास के स्तर को बहुत कम करता है

यह जरूरी नहीं कि बुरे द्वारा प्रदान किया गया है आपको पता है कि आप इसे किस संदर्भ में उपयोग कर रहे हैं।

यदि आपका एप्लिकेशन कुछ जेएसओएन से एक ऑब्जेक्ट बनाने के लिए eval () का प्रयोग कर रहा है जो कि XMLHttpRequest से आपकी खुद की साइट पर वापस आ गया है, जो आपके विश्वसनीय सर्वर-साइड कोड द्वारा बनाई गई है, शायद यह समस्या नहीं है

अविश्वसनीय क्लाइंट-साइड जावास्क्रिप्ट कोड ऐसा कुछ भी नहीं कर सकता। बशर्ते आप जिस चीज को तैयार कर रहे हैं वह उचित स्रोत से आया है, आप ठीक हैं

यदि आप उपयोगकर्ता को कुछ तार्किक कार्यों को इनपुट करने और उसके लिए मूल्यांकन करने के लिए चाहते हैं या फिर जावास्क्रिप्ट eval फ़ंक्शन सही है। मैं दो तार और eval(uate) string1 === string2 स्ट्रिंग eval(uate) string1 === string2 , आदि स्वीकार कर सकता हूँ।

यदि आप अपने कोड में eval () का इस्तेमाल करते हैं, तो याद रखें मंत्र "eval () बुरा है।"

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

 // antipattern var property = "name"; alert(eval("obj." + property)); // preferred var property = "name"; alert(obj[property]); 

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

यह याद रखना भी महत्वपूर्ण है कि setInterval() , setTimeout() , और Function() कन्स्ट्रक्टर सेट करने के लिए पासिंग स्ट्रिंग, अधिकांश भाग के लिए, eval() का उपयोग करने के समान है और इसलिए इसे टाला जाना चाहिए।

पर्दे के पीछे, जावास्क्रिप्ट को अभी भी स्ट्रिंग को प्रोग्रामिंग कोड के रूप में पास करने और निष्पादित करना है:

 // antipatterns setTimeout("myFunc()", 1000); setTimeout("myFunc(1, 2, 3)", 1000); // preferred setTimeout(myFunc, 1000); setTimeout(function () { myFunc(1, 2, 3); }, 1000); 

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

एक छोटा सा संभावित लाभ है क्योंकि नया फ़ंक्शन () में मूल्यांकन किए गए कोड स्थानीय फ़ंक्शन गुंजाइश में चल रहे होंगे, इसलिए मूल्यांकित होने वाले कोड में वेरिएबल के साथ परिभाषित कोई भी वैरिएबल स्वचालित रूप से ग्लोबल्स नहीं बनेंगे।

स्वचालित ग्लोबल्स को रोकने का दूसरा तरीका एक तत्काल कार्य में eval() कॉल को लपेट करना है

संभावित सुरक्षा के मुद्दों के अलावा यदि आप उपयोगकर्ता द्वारा जमा किए गए कोड निष्पादित कर रहे हैं, तो ज्यादातर समय एक बेहतर तरीका है जिसमें हर बार कोड निष्पादित करने के लिए कोड को पुनः पार्स करना शामिल नहीं होता है। बेनामी कार्यों या ऑब्जेक्ट गुण eval के अधिक उपयोगों को बदल सकते हैं और अधिक सुरक्षित और तेज़ हैं

यह एक समस्या का अधिक हो सकता है क्योंकि ब्राउज़र की अगली पीढ़ी जावास्क्रिप्ट कंपाइलर के कुछ स्वाद के साथ बाहर आती है। ईवाल के माध्यम से निष्पादित कोड इन नए ब्राउज़रों के साथ-साथ आपकी जावास्क्रिप्ट के बाकी हिस्सों के साथ-साथ प्रदर्शन नहीं कर सकता है। किसी को कुछ प्रोफाइलिंग करना चाहिए

यह eval के बारे में बात कर रहे अच्छे लेखों में से एक है और यह कैसे बुरा नहीं है: http://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/

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

जावास्क्रिप्ट इंजन में कई प्रदर्शन ऑप्टिमाइज़ेशन हैं जो संकलन चरण के दौरान करता है। इन में से कुछ कोड को अनिवार्य रूप से स्थिर रूप से विश्लेषण करने में सक्षम होने के लिए उबाल होते हैं, और यह निर्धारित करते हैं कि सभी चर और फ़ंक्शन घोषणाएं कहाँ हैं, ताकि निष्पादन के दौरान आइडेंटिफ़ायर को हल करने के लिए कम प्रयास किया जा सके।

लेकिन अगर इंजन कोड में एक eval (..) पाता है, तो यह अनिवार्य रूप से यह मानना ​​है कि पहचानकर्ता स्थान की सभी जागरूकता अमान्य हो सकती है, क्योंकि यह lexing समय पर नहीं पता है कि वास्तव में कौन से कोड आप eval (..) पास कर सकते हैं लेक्सिकल गुंजाइश को संशोधित करने के लिए, या उस ऑब्जेक्ट की सामग्री जिसे आप परामर्श करने के लिए एक नया लेक्सिकल स्कोप बनाने के लिए पास कर सकते हैं।

दूसरे शब्दों में, निराशावादी अर्थों में, उन अनुकूलनों में से अधिकांश यह बेकार होगा यदि eval (..) मौजूद है, इसलिए यह अनुकूलन बिल्कुल बिल्कुल नहीं करता है।

यह सब बताता है

संदर्भ:

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md#eval

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md#performance

eval () बहुत शक्तिशाली है और इसका उपयोग किसी जेएस स्टेटमेंट को निष्पादित करने या अभिव्यक्ति का मूल्यांकन करने के लिए किया जा सकता है। लेकिन सवाल eval () के उपयोगों के बारे में नहीं है, लेकिन केवल कुछ कहने पर आपको यह बताता है कि आपके द्वारा चल रही स्ट्रिंग दुर्भावनापूर्ण पार्टी से कैसे प्रभावित होती है। अंत में आप दुर्भावनापूर्ण कोड चलेंगे। शक्ति के साथ बड़ी जिम्मेदारी आता है इसलिए इसे समझदारी से उपयोग करें, आप इसका उपयोग कर रहे हैं। यह बहुत eval () फ़ंक्शन से संबंधित नहीं है, लेकिन यह लेख बहुत अच्छी जानकारी है: http://blogs.popart.com/2009/07/javascript-injection-attacks/ यदि आप eval की मूल बातें खोज रहे हैं () यहां देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

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

मूलतः से

 <div> {{#each names}} <span>{{this}}</span> {{/each}} </div> 

इसके लिए

 (function (state) { var Runtime = Hyperbars.Runtime; var context = state; return h('div', {}, [Runtime.each(context['names'], context, function (context, parent, options) { return [h('span', {}, [options['@index'], context])] })]) }.bind({})) 

eval() का प्रदर्शन इस तरह की स्थिति में एक मुद्दा नहीं है क्योंकि आपको केवल एक बार उत्पन्न स्ट्रिंग को समझना पड़ता है और उसके बाद कई बार निष्पादन योग्य आउटपुट का पुन: उपयोग किया जाता है।

यदि आप उत्सुक हैं तो आप कोड जनरेशन कैसे प्राप्त कर सकते हैं यह देख सकते हैं

मैं इससे कुछ भी खंडन करने का प्रयास नहीं करूँगा, लेकिन मैं इस eval () के उपयोग की पेशकश करेगा (जहां तक ​​मुझे पता है) किसी अन्य तरीके से नहीं किया जा सकता है शायद यह कोड के अन्य तरीके हैं, और संभवत: इसे अनुकूलित करने के तरीके हैं, लेकिन यह लंबे समय से किया जाता है और स्पष्टता के लिए किसी भी घंटी और सीटी के बिना eval के उपयोग को स्पष्ट करने के लिए वास्तव में कोई अन्य विकल्प नहीं है। यही है: डायनामिकल (या अधिक सटीक) प्रोग्राम-आधारित ऑब्जेक्ट नाम (मानों के विपरीत)।

 //Place this in a common/global JS lib: var NS = function(namespace){ var namespaceParts = String(namespace).split("."); var namespaceToTest = ""; for(var i = 0; i < namespaceParts.length; i++){ if(i === 0){ namespaceToTest = namespaceParts[i]; } else{ namespaceToTest = namespaceToTest + "." + namespaceParts[i]; } if(eval('typeof ' + namespaceToTest) === "undefined"){ eval(namespaceToTest + ' = {}'); } } return eval(namespace); } //Then, use this in your class definition libs: NS('Root.Namespace').Class = function(settings){ //Class constructor code here } //some generic method: Root.Namespace.Class.prototype.Method = function(args){ //Code goes here //this.MyOtherMethod("foo")); // => "foo" return true; } //Then, in your applications, use this to instantiate an instance of your class: var anInstanceOfClass = new Root.Namespace.Class(settings); 

संपादित करें: वैसे, मैं सुझाव नहीं देता (सभी सुरक्षा कारणों से पहले बताया गया है) कि आप उपयोगकर्ता इनपुट पर नामों का आधार बनाते हैं। मैं किसी भी अच्छे कारण की कल्पना नहीं कर सकता क्योंकि आप ऐसा करना चाहते हैं। फिर भी, सोचा कि मैं इसे बताऊंगा कि यह एक अच्छा विचार नहीं होगा 🙂