2010-02-25 9 views
8

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

आप किस विशिष्ट परिस्थितियों में eval का उपयोग करना चाहिए क्योंकि इसके आसपास कोई अन्य तरीका नहीं है?

स्पष्टता के लिए:

हम उपयोगकर्ता के आपूर्ति डेटा के बारे में बात नहीं कर रहे। तो सवाल eval के शुद्ध और पूरी तरह से नियंत्रित सर्वर-साइड वैध उपयोग पर केंद्रित है।

उत्तर

0

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

eval भी evil php में है।

है क्या विशिष्ट स्थितियों आप उपयोग eval() क्योंकि ऐसा करना चाहिए इसके आसपास कोई अन्य तरह से

?

सबसे पहले, हम करने की कोशिश यह जितना संभव हो उतना से बचने के लिए, लेकिन आप का उपयोग करने के लिए कि कुछ कोड को क्रियान्वित करने के लिए क्या है, तो आप उस के साथ जाना होगा, लेकिन जैसा कि कहा कि यह बुराई है, आप अपने पर अपने जोखिम पर उपयोग करते हैं।

बॉटम लाइन:

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

+0

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

+0

@ क्रॉडर: उन्होंने कहा, "मुझे पता है कि गति और सुरक्षा कारणों से जावास्क्रिप्ट में eval से बचा जाना चाहिए। लेकिन PHP के मामले में, शायद ही कभी सुरक्षा का उल्लेख किया गया है।" मान लीजिए कि php में बुरा होने का उल्लेख नहीं किया गया है :) मैंने स्थिति/उपयोग के हिस्से पर भी चर्चा की है। धन्यवाद – Sarfraz

10

PHP में eval के साथ eval की सुरक्षा समस्याएं जावास्क्रिप्ट में समान हैं: यदि आप कुछ कोड का मूल्यांकन करते हैं, तो आपको यह सुनिश्चित करना होगा कि यह कहां है से आता है, और इसमें क्या शामिल है।

सुरक्षा निहितार्थ भी, अधिक से अधिक हो सकता है के रूप में PHP (अन्य बातों के साथ) अपने डेटाबेस के लिए उपयोग है - यह चोरी करने के लिए इस्तेमाल किया जा सकता है जिसका अर्थ है/भ्रष्ट लगभग एवरी आपके आवेदन पर निर्भर करता है जानकारी!

जावास्क्रिप्ट में, वे कहते हैं कि "eval बुरा है"; यह शायद PHP में सच है कि यह जावास्क्रिप्ट में सच है।


अब, विशिष्ट स्थितियों के बारे में जिसमें आप eval का उपयोग नहीं कर सकते हैं ...खैर, मेरी हर दिन काम के रूप में PHP में developping की 4 साल की तरह कुछ में, मैं होने कभी मेरे अपने कोड में eval इस्तेमाल किया ^^

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

+0

पूरी तरह से सहमत हैं। मैं जेएस eval से PHP eval के साथ और अधिक सावधान रहना होगा, और मैं एक उदाहरण याद नहीं कर सकता जहां मुझे इसकी आवश्यकता थी। –

+4

+1 मैं कहूंगा कि यह डिस्क, डेटाबेस और मनमाने ढंग से नेटवर्क पहुंच के कारण जावास्क्रिप्ट की तुलना में ** ** ** निश्चित रूप से अधिक बुरा है। –

0

मैं पूरी तरह से मुद्दा यह है कि eval बुराई है में पिछले जवाब से सहमत हैं, और मैं अपने कोड में इसका इस्तेमाल कभी नहीं।

लेकिन एक स्थिति में मैं eval से बचने में कामयाब नहीं रहा है। मुझे php में ज्यादा अनुभव नहीं है, इसलिए अगर कोई मुझे सलाह देता है कि मैं कोड को 'eval' के बिना कैसे लिख सकता हूं तो मुझे खुशी होगी। यह स्थिति है कि मेरे पास एक चर नाम में संग्रहीत कक्षा का नाम था, और मुझे उस वर्ग पर एक स्थिर विधि कॉल करना पड़ा, वर्गनाम एक विश्वसनीय स्रोत से आया था। तो मैं कुछ इस तरह लिखना पड़ा:

eval("\$result = $className::methodName()"); 

(क्योंकि आप बस नहीं लिख सकते हैं $ className :: methodName());

+0

'call_user_func (सरणी ($ className,' methodName ')) या 'call_user_func (" $ className :: methodName ")', PHP के आपके संस्करण के आधार पर। – Matthew

+0

call_user_func (सरणी ($ className, $ methodName)); कार्य करना चाहिए। संपादित करें: konforce मेरे सामने में मिल गया :) – Jimmeh

+0

सुरक्षा के साथ ही समस्या नहीं है, लेकिन प्रदर्शन बेहतर है ... पता नहीं है मैं क्यों का उपयोग कर के बारे में सोचा नहीं था कि) – kipelovets

0

आप PHP 5.3 से पहले गुमनाम कार्यों का उपयोग करना चाहते हैं, तो आप create_function है, जो एक eval() कॉल लपेटता उपयोग करने के लिए की जरूरत है।

2

Eval और create_function आर्बिट कोड इंजेक्शन की अनुमति दे सकता है। PHP में बहुत सी चीजें हैं जिनका उपयोग आपके आवेदन की सुरक्षा समझौता करने के लिए किया जा सकता है।

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

लेकिन इस तरह के एक अमूर्त स्तर पर प्रोग्रामिंग भाषाओं की चर्चा क्या StackOverflow के बारे में है नहीं है।

सी

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