2008-09-25 9 views
5

मैं सोच रहा हूँ क्या सुरक्षा चिंताओं वहाँ एक PHP evaluator इस तरह लागू करने के लिए कर रहे हैं:उपयोगकर्ता कोड का मूल्यांकन करने की सुरक्षा चिंताओं क्या हैं?

<?php eval($_POST['codeInput']); %> 

यह एक PHP sandbox तो DB input आदि के खिलाफ प्रतिबंध लगाया बनाने के संदर्भ में है एक बड़े पैमाने पर मुद्दा नहीं है।

उपयोगकर्ता जिस सर्वर पर होस्ट किया गया है उसे नष्ट कर रहे हैं।

मैंने Ruby simulators देखा है, इसलिए मैं उत्सुक था कि सुरक्षा में क्या शामिल है (कम से कम अस्पष्ट विवरण)।


धन्यवाद सब कुछ। मुझे यह भी यकीन नहीं है कि किस उत्तर को स्वीकार करना है क्योंकि वे सभी उपयोगी हैं।

Owen's answer मुझे जो संदेह है (सर्वर स्वयं जोखिम में होगा) का सारांश देता है।

arin's answer संभावित समस्याओं का एक बड़ा उदाहरण देता है।

Geoff's answer और randy's answer सामान्य राय को प्रतिबिंबित करें कि आपको सिमुलेशन प्रकार क्षमताओं को प्राप्त करने के लिए अपना खुद का मूल्यांकनकर्ता लिखना होगा।

उत्तर

5

संभवतः वास्तव में बहुत बड़ी मुसीबत में हो सकता है अगर आप eval() 'यह एक चरम उदाहरण है जैसे

<?php 
    eval("shell_exec(\"rm -rf {$_SERVER['DOCUMENT_ROOT']}\");"); 
?> 

कुछ d लेकिन यह उस मामले अपनी साइट बस नष्ट कर दिया जायेगा। उम्मीद है कि आपकी अनुमतियां इसकी अनुमति नहीं देगी, लेकिन यह sanitization & चेक की आवश्यकता को स्पष्ट करने में मदद करती है।

+0

एक ठोस उदाहरण के लिए धन्यवाद :-) –

18

ऐसा मत करो।

वे मूल रूप से आप PHP में क्या कर सकते हैं कुछ भी करने के लिए उपयोग कर सकते है (फाइल सिस्टम के चारों ओर देखो, मिल/चर, अन्य मशीनों को खुले कनेक्शनों कोड डालने के लिए किसी भी प्रकार का चलाने के लिए, आदि सेट ...)

+0

हाँ मैं सोच रहा था कि उनके पास किस प्रकार की फ़ाइल पहुंच होगी। वह समस्या थी। धन्यवाद। –

4

ऐसी कई चीजें हैं जो आप कह सकते हैं .. चिंताएं PHP के लिए विशिष्ट नहीं हैं।

किसी भी इनपुट अपने मशीन (या डेटाबेस) को स्वच्छ करने की आवश्यकता है:

यहाँ सरल जवाब है।

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

Wikipedia on Code Injection:

कोड इंजेक्शन यहाँ पर एक बहुत अच्छी परिचयात्मक लेख नहीं है।

+0

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

+0

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

4

यदि आप अपने सर्वर पर मनमाने ढंग से कोड चलाने की अनुमति देते हैं, तो यह आपका सर्वर नहीं है।

+0

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

-1

जैसा कि पहले से ही उत्तर दिया गया है, आपको अपने इनपुट को स्वच्छ करने की आवश्यकता है। मुझे लगता है कि आप "exec" जैसे अवांछित आदेशों को हटाने के लिए कुछ प्रकार के कुछ regex-filtring का उपयोग कर सकते हैं और मूल रूप से प्रत्येक दुर्भावनापूर्ण कमांड को PHP (या जिसका शोषण किया जा सकता है), और यह बहुत कुछ है।

+2

सफाई के लिए ब्लैकलिस्ट का उपयोग न करें! हमेशा श्वेतसूची का उपयोग करें। – Lewis

+0

मुझे नहीं लगता कि लुईस की टिप्पणी पर अत्यधिक जोर दिया जा सकता है - यदि आप ब्लैकलिस्ट का उपयोग करके "अपने इनपुट को स्वच्छ करने" का प्रयास करते हैं, उदा। रेगेक्स - इस मामले में, यह बेकार के करीब है - मैं आसानी से लागू करने की कोशिश कर रहे किसी भी रेगेक्स के आसपास हो जाऊंगा, और बिना किसी संदर्भ के मेरे कोड को चला सकता हूं। – AviD

3

प्रिय भगवान नहीं। मैं शीर्षक पर भी क्रिंग करता हूं। उपयोगकर्ता को किसी प्रकार का मनमाना कोड चलाने की अनुमति देना सर्वर को

मुझे पता है कि मेरे ऊपर के लोगों ने पहले ही कहा है। लेकिन मेरा विश्वास करो। यह कभी भी पर्याप्त समय नहीं है कि कोई आपको आपके इनपुट को स्वच्छ करने के लिए कह सकता है।

यदि आप वास्तव में, वास्तव में उपयोगकर्ता को किसी प्रकार का कोड चलाने की अनुमति देना चाहते हैं। कुछ प्रकार की psudo भाषा बनाकर उपयोगकर्ता को उपलब्ध आदेशों का सबसेट बनाएं जिसे उपयोगकर्ता ऐसा करने के लिए उपयोग कर सकते हैं। ए-ला जिस तरह से बीबीकोड या मार्कडाउन काम करता है।

2

आपके सर्वर, अवधि पर unfiltered कोड निष्पादित करने की अनुमति दें।

यदि आप ऐसा टूल बनाना चाहते हैं जो किसी भाषा के इंटरैक्टिव प्रदर्शन की अनुमति देता है जैसे कि यहां देखा गया टूल: http://tryruby.hobix.com/ मैं भाषा के उप-हिस्से को कोडिंग करने पर काम करता हूं। आदर्श रूप से, आप नए प्रोग्रामर को सरल अवधारणाओं का प्रदर्शन करने के लिए इसका उपयोग करेंगे, इसलिए यदि आप सभी सुविधाओं को सही ढंग से कार्यान्वित करते हैं तो यह अप्रासंगिक है।

ऐसा करके आप ज्ञात स्वीकार्य इनपुट के सफेद सूची के माध्यम से इनपुट को नियंत्रित कर सकते हैं। यदि इनपुट सफेद सूची पर नहीं है तो इसे निष्पादित नहीं किया जाता है।

शुभकामनाएँ!

3

यदि आप online PHP interpreter बनाने की सोच रहे हैं, तो आपको एक वास्तविक REPL दुभाषिया बनाने और eval का उपयोग करने की आवश्यकता नहीं होगी।

अन्यथा, कभी भी मनमाने ढंग से उपयोगकर्ता कोड निष्पादित न करें। कभी।

6

eval() फ़ंक्शन को स्वच्छ करना मुश्किल है और यहां तक ​​कि यदि आपने वहां किया तो निश्चित रूप से इसके आसपास एक रास्ता होगा। भले ही आपने exec फ़िल्टर किया हो, फिर भी आपको किसी भी प्रकार स्ट्रिंग exec को एक चर में चिपकाना है, और फिर $variable() करें। आपको कम से कम कुछ प्रकार की काल्पनिक सुरक्षा प्राप्त करने के लिए भाषा को वास्तव में अपंग करना होगा।

+0

+12! इस प्रतिक्रिया में अन्य सभी की तुलना में अधिक मूल्य है, बहुत बुरा यह अधिक चिह्नित नहीं किया गया है। – AviD

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