2009-03-19 15 views
5

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

उदाहरण के लिए, यदि मैं प्राप्त कोड "myfunc (1,2,3) था, दूसरा फ़नक (3,2,1);"
मैं कोड को चलाने के लिए इसे सीधे() कर सकता हूं।

लेकिन call_user_func() के लिए, मुझे स्ट्रिंग को पार्स करना होगा ताकि इसे चलाया जा सके। तो इस मामले में उपयोग करने के लिए बेहतर काम कौन सा है?

+0

संपादित करें के बारे में क्षमा करें, लेकिन मैं इस तरह के विचार प्राप्त जब भी मैं देख रहा हूँ कुछ का कोई मौका नहीं :) इसे हटाने के लिए, अगर आपको लगता है कि यह वहां नहीं होना चाहिए स्वतंत्र महसूस न हो। –

+0

क्षमा करें, लेकिन यह न तो मजाकिया और न ही निर्देशक है। केवल विशेषाधिकारों का दुरुपयोग [आईएमएचओ]। – soulmerge

+0

कोई मौका नहीं है, क्योंकि मैं डेटाबेस से लिखने के लिए केवल एकमात्र हूं जिसे कॉल करता है। – Drahcir

उत्तर

2

एक सामान्य नियम के रूप में, मैं हमेशा जितना संभव हो सके eval() से दूर रहने की कोशिश करता हूं। हालांकि, यह मामला इसके लिए एक अच्छे उम्मीदवार की तरह दिखता है।

आप कहते हैं "असुरक्षित कोड इंजेक्शन होने का कोई मौका नहीं है", इसलिए बड़ा सवाल यह है कि क्या डेटाबेस में असंगत कोड होने का मौका है?

यदि नहीं, eval() समाधान है, लेकिन यदि उचित पार्सिंग और त्रुटि लॉगिंग/आदि एक सुरक्षित शर्त हो सकती है। (मुझे विश्वास है कि call_user_func_array() सिद्धांत में तेजी से है, इसलिए कोई पार्सिंग ओवरहेड नगण्य हो सकता है)

1

मुझे लगता है कि पार्सिंग ओवरहेड जोड़ देगा, लेकिन एकमात्र तरीका यह सुनिश्चित करना है कि आप इसका परीक्षण कर सकें। विभिन्न कार्यों के साथ दोनों तरीकों का प्रयास करें और देखें कि आपके परिणाम क्या हैं। कोड का प्रयोग करें जो दर्शाता है कि आप क्या स्टोर करना चाहते हैं।

शुभकामनाएं!

1

eval() का उपयोग करें। कुछ भी प्रयास के लायक नहीं है - उनके पास कोई सकारात्मक साइड इफेक्ट नहीं होगा।

1

आप runkit विस्तार पर एक नज़र डालना चाहते हैं, जो चलने वाले कोड को प्रभावित नहीं करने वाले सैंडबॉक्स में PHP को निष्पादित कर सकता है।

यदि कोड आपके चल रहे कोड को प्रभावित करने का अनुमान है, तो eval() के लिए जाएं।

4

डेटाबेस में PHP संग्रहीत करना एक खराब डिज़ाइन गंध है; भले ही इस मामले में आप निश्चित रूप से सुनिश्चित नहीं हैं कि इसमें कभी भी असुरक्षित कोड नहीं हो सकता है, इसलिए आपको धारणाओं या रक्षाओं की संख्या को कम करना हमेशा अच्छा होता है। यदि आप डेटाबेस में PHP कोड संग्रहीत करते हैं, तो एक हमलावर जिसमें हमलावर आपके डेटाबेस तक पहुंच प्राप्त करता है, वह जल्द ही बहुत गंभीर हो जाता है, जिस पर हमलावर मनमाने ढंग से कोड चला सकता है! मुझे पता है कि इस तरह से आपके डेटाबेस से समझौता होने की संभावना बहुत कम है, लेकिन फिर भी यह अच्छी सुरक्षा प्रथा है कि किसी भी संभावित स्थिति को आपके सिस्टम से इसकी तुलना में अधिक समझौता न करने दें।

Many people agree कि eval() हमेशा अपवाद के बिना, PHP कोड से बचा जाना चाहिए। हमेशा एक विकल्प है।

हालांकि, मुझे लगता है कि मुझे लगता है कि मुझे यह कहना होगा कि eval() का उपयोग करना आपके लिए सबसे अच्छा समाधान होगा, क्योंकि आप पहले ही डीबी में PHP कोड संग्रहीत कर रहे हैं, इसलिए eval() का उपयोग नहीं किया जा रहा है इससे पहले कि आप अपने जोखिम को आगे बढ़ाएं।

मैं, फिर भी, सुझाव है कि

  1. आप जो अनुमति देते हैं में रूढ़िवादी होने से() इससे पहले कि आप eval कोड को मान्य करने के लिए यह, की कोशिश करो। मान लें कि किसी भी तरह एक हमलावर आपके डेटाबेस में आया है, यह भी सोचा कि यह असंभव है।
  2. आप कम से कम अपने आवेदन को फिर से लिखने के लिए कुछ गंभीर विचार देते हैं ताकि PHP कोड डेटाबेस में संग्रहीत न हो। यदि आप जटिल डेटा संरचनाओं को संग्रहीत कर रहे हैं, तो JSON या यहां तक ​​कि XML जैसे कुछ के बारे में सोचें। इनके लिए सुरक्षित पार्सर्स मौजूद हैं।

मैं इस सवाल का जवाब एक सा प्रतिक्रियावादी लगता है अगर माफी चाहता हूँ; मुझे लगता है कि इस तरह की चीज बहुत महत्वपूर्ण है।

0

आप कोड आप कर रहे हैं के बारे में एक आज़माएं/कैच ब्लॉक में भी चलाने के लिए लपेट चाहिए, मामले में (एक त्रुटि भले ही आप ने कहा कि नहीं होगा वहाँ एक संभावना है है, है, और यह सबसे अच्छा अभ्यास है)

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