2010-08-17 13 views
5

संभव डुप्लिकेट:
PHP: How To Disable Dangerous Functionsखतरनाक PHP कार्यों के उपयोग से इनकार कैसे करें?

हाय, यह मेरी स्थिति है: मैं अपने ग्राहकों PHP कोड डालने देती चाहिए, लेकिन स्ट्रिंग समारोह, तारीख समारोह आदि तो मैं जैसे ही सुरक्षित कार्यों PHP फ़ाइल में सहेजने से पहले स्ट्रिंग प्रतिस्थापन का उपयोग करके उन्हें हटाने के लिए खतरे PHP फ़ंक्शंस सूची की आवश्यकता है। कोई उपाय?

उत्तर

7

इसे भूल जाओ। PHP में विश्वसनीय फ़ंक्शन श्वेतसूची संभव नहीं है। उदाहरण:

$x = 'e' . str_replace('y', 'x', 'yec'); 
...lots of code... 
$x('format c:'); 

यथार्थवादी विकल्प हैं

+1

@stereofrog यही कारण है कि मैं यह नहीं कर रहा हूँ की सिफारिश है। इसे कम भ्रमित करने के लिए मेरे उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। मैं स्पष्टीकरण पर भयानक हूँ। – NullUserException

+0

यह नहीं होना चाहिए कि "विश्वसनीय फ़ंक्शन ** श्वेतसूची ** PHP में असंभव है"? क्योंकि अक्षम_फंक्शन का उपयोग करके ब्लैकलिस्टिंग संभव है। – wimvds

+0

ध्यान नहीं दिया, मैं इसे संपादित करूँगा: पी। – wimvds

1

उपयोगकर्ताओं संभावना PHP कोड दर्ज करने के लिए देते वास्तव में खतरनाक है । इसे लागू करने से पहले अन्य सभी विकल्पों पर विचार करें। कुछ प्रकार का PHP-कोड बिल्डर। एक प्रश्न निर्माता पर प्रेरित हो गया।

यदि आप ग्राहकों द्वारा PHP कोड की अनुमति देने का निर्णय लेते हैं, तो श्वेतसूची का उपयोग करना बेहतर होता है। आपको पोस्ट कोड से इन कार्यों को निकालने के लिए नियमित अभिव्यक्तियों का उपयोग करना चाहिए।

+4

PHP नियमित भाषा नहीं है। – Gumbo

+0

@ गम्बो: कृपया बताएं कि इस स्थिति के साथ क्या करना है? –

+1

@Stegeman आप नियमित रूप से ऐसी भाषा पर नियमित अभिव्यक्तियों का उपयोग नहीं कर सकते हैं जो नियमित नहीं है। – NullUserException

1

यदि आप इसे सही करना चाहते हैं तो आपको क्या करना है, यह बेहद कठिन काम है। मैं parsing द्वारा दर्ज PHP कोड को शुरू होता है,, प्रत्येक बुलाया समारोह जाँच backticks कुल मिलाकर अनुमति न देने, आदि

दूसरे शब्दों में: आप PHP की एक उप-सेट आप अपने खुद के lexer (भले ही पीएचपी को लागू करना चाहिए अनुमति देना चाहते हैं आपको बॉक्स के बाहर parser प्रदान करता है)।

2

जहाँ तक मुझे पता है, आप केवल एक काले सूची दृष्टिकोण का उपयोग कर सकते हैं:

बेशक, आप पर विचार करने के लिए कैसे संभव इसे बनाए रखने के लिए है है सभी संभावित एक्सटेंशन द्वारा परिभाषित सभी बिल्टिन कार्यों की एक अद्यतन सूची।

एक और संभावना है मैं के बारे में सोच सकते हैं एक सरल tokenizer लिख रहा है:

http://es2.php.net/manual/en/function.token-get-all.php

फिर आप एक सफेद सूची के खिलाफ इस्तेमाल किया कार्यों की जांच कर सकते हैं।

अद्यतन: मैं गलत धारणा थी कि token_get_all() समारोह कॉल की पहचान हैं लेकिन यह वास्तव में नहीं है। वे सभी T_STRING एस हैं।

+0

+1, मुझे समझ में नहीं आ रहा है कि लोग इस तरह के मुद्दों को जटिल बनाने के लिए क्यों कहते हैं, इसे अधिक जटिल बनाने से यह अधिक सुरक्षित नहीं होगा, मूल अक्षमताओं जैसे 'अक्षम-कार्य' और 'अक्षम-वर्ग' – RobertPitt

+0

@stereofrog, मैंने यह पता लगाया है कि आप क्या मतलब (आप वास्तव में नहीं कहते हैं) और तदनुसार मेरी पोस्ट संपादित की। –

+0

PHP.net के टोकन दस्तावेज़ों में काफी कमी है। वे कुछ टोकन छोड़ देते हैं और कुछ टोकन को गलत तरीके से परिभाषित करते हैं - या तो उनका उपयोग 'token_get_all()' और PHP की चेतावनी/त्रुटि संदेशों द्वारा भिन्न होता है, और वे बाद वाले द्वारा जा रहे हैं। –

2

सबसे सुरक्षित और आसान बनाए रखने का विकल्प PHP में समर्पित "मिनी-भाषा" प्रोग्राम करना होगा। आप इसे php का सबसेट बना सकते हैं, या इसे Excel सूत्रों की तरह दिख सकते हैं, या यहां तक ​​कि अपना स्वयं का आविष्कार भी कर सकते हैं। इस तरह आप हमेशा क्या हो रहा है का पूरा नियंत्रण रखेंगे।

//

सिर्फ मनोरंजन के लिए, यहाँ आप

function lisp($x) { 

    if(is_string($x)) { 
     $re = '~\(([^()]*)\)~'; 
     while(preg_match($re, $x)) 
      $x = preg_replace_callback($re, 'lisp', $x); 
     return trim($x); 
    } 

    $x = preg_split('~\s+~', $x[1]); 
    $e = array_shift($x); 
    if(!$x) 
     return is_numeric($e) ? floatval($e) : $e; 

    switch($e) { 
     case '+': return lisp($x[0]) + lisp($x[1]); 
     case '-': return lisp($x[0]) - lisp($x[1]); 
     case '*': return lisp($x[0]) * lisp($x[1]); 
     case '/': return lisp($x[0])/lisp($x[1]); 

     case 'concat': return lisp($x[0]) . lisp($x[1]); 
    } 

    return function_exists($e) ? 
     call_user_func_array($e, array_map('lisp', $x)) : ''; 
} 

$input = ' 
    (strtolower 
     (concat 
      (strrev olleh) 
      (+ 22 20)))'; 

echo lisp($input); // hello42 

एक छोटे से लिस्प है;))

+0

यह संभावित रूप से काम * एक * है। – NullUserException

+0

आप एक गतिशील-स्कोप्ड लिस्प -1 बना सकते हैं। आपको उन्हें यह बताने की ज़रूरत नहीं है कि यह लापरवाही है। या यदि आप चाहें, तो आप PHP के लिए LIME प्राप्त कर सकते हैं और इन्फिक्स बीजगणित को लागू कर सकते हैं, शायद [वर्ग ब्रैकेट] के अंदर और टीसीएल की तरह दिखने वाला कुछ ऐसा कर सकते हैं। इसे PHP की तरह क्यों दिखना है? – Ian

+0

या आप PHP में PHP के सबसेट का पार्सर लिख सकते हैं और केवल चयनित फ़ंक्शंस चला सकते हैं! : डी – naugtur

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