2013-03-22 8 views
5

php में ऐसे कई पृष्ठ में चेतावनी एक चेतावनी है escapeshellcmd:<code>escapeshellcmd</code> के लिए

escapeshellcmd() पूरे कमांड स्ट्रिंग पर इस्तेमाल किया जाना चाहिए, और यह अभी भी हमलावर तर्कों की मनमाना संख्या पारित करने के लिए अनुमति देता है । से बचने के लिए एक ही तर्क escapeshellarg() का उपयोग इसके बजाय किया जाना चाहिए।

क्या कर रहा हूँ मैं इस से समझने के लिए:

  1. मैं हमेशा पूरे कमांड स्ट्रिंग escapeshellcmd का उपयोग कर, तर्क है कि पहले से ही escpaeshellarg के साथ भाग कर दिया है सहित भागने चाहिए?
  2. क्या मुझे केवल उन आदेशों से बचाना चाहिए जो पैरामीटर नहीं हैं (यदि आप मुझसे पूछें तो केवल तार्किक बात है)?
  3. क्या मुझे इस संदिग्ध चेतावनी को अनदेखा करना चाहिए जो इन 2 कार्यों को एक-दूसरे की प्रशंसा कैसे करता है, इस बारे में और भी भ्रम पैदा करता है?

धन्यवाद, कॉस्मिन

+0

क्या आपके द्वारा या उपयोगकर्ता द्वारा प्रदान किया गया आदेश है? तर्क - एक ही सवाल। – thatidiotguy

+0

चलो दोनों मामलों को ध्यान में रखें: 1. 'ls $ arg'' 2.' $ cmd $ arg'' आप इन मामलों को संभालने के बारे में कैसे जाएंगे? – Interfector

उत्तर

6

कम

  • में कुछ इस तरह का उपयोग करने से एक उपयोगकर्ता बंद नहीं होंगे escapeshellarg: एकल उद्धरण के साथ एक तर्क संलग्न करने के लिए प्रयोग किया जाता है और यह तर्क के भीतर उद्धरण से बच निकलता है टी।
  • escapeshellcmd: शैल मेटाएक्टएक्टर्स से बचने के लिए उपयोग किया जाता है i.e <,>, | आदि

यह मानते हुए कि php के अपने संस्करण के आदेश के निष्पादन के लिए पार्टी पर निर्भर करता है, हम, bash manual से पता

एकल उद्धरण में संलग्न पात्रों उद्धरण के भीतर प्रत्येक चरित्र के वस्तुतः मान बरकरार रखता है। सिंगल कोट्स के बीच एक सिंगल कोट नहीं हो सकता है, यहां तक ​​कि बैकस्लैश से पहले भी।

$c = escapeshellcmd($cmd) . ' ' . escapeshellarg($arg1); 

बहरहाल, यह अगर तुम में से एक को ग $ पारित करने के लिए की जरूरत है आप समस्याओं दे सकते हैं:

इसलिए, हम निष्कर्ष है कि एक आदेश बनाने के निम्नलिखित तरीके से पर्याप्त होना चाहिए करने के लिए आ सकते हैं निम्नलिखित कार्य: निष्पादन, प्रणाली, पासथ्रू इत्यादि। अनुभवजन्य विश्लेषण से पता चला है कि ये कार्य कुछ पात्रों का मूल्यांकन कर सकते हैं। एक उदाहरण के रूप में इस प्रयास करें:

$cmd = 'echo'; 
$arg = 'TEST\0ING'; // Since we are using single quotes, \0 shouldn't be evaluated as a null byte char 
$c = escapeshellcmd($cmd) . ' ' . escapeshellarg($arg1); // echo 'TEST\0ING' 
exec($c . ' > output.txt'); // writes TEST without the ING to output.txt 

कार्यकारी समारोह एक अशक्त बाइट वर्ण के रूप में '\ 0' का मूल्यांकन करता है और इसलिए output.txt केवल तक '\ 0' का डेटा होगा। इसका परीक्षण उबंटू पर PHP 5.4.6 चल रहा है। मेरी राय में, यह एक बग है क्योंकि डेटा का शाब्दिक अर्थ खो गया है। इसलिए, यह पूरी स्ट्रिंग पर escapeshellcmd उपयोग करने के लिए के रूप में यह भी बैकस्लैश निकल जाता है अपेक्षाकृत सुरक्षित है '\' जो एक खोल metacharacter है:

$c = escapeshellcmd($cmd . ' ' . escapeshellarg($arg1)); 
exec($c . ' > output.txt'); // writes TEST\0ING to output.txt 

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि अन्य अक्षरों से परे भी भाग निकले और होगा हो जाएगा कार्यक्रम ($ cmd) से अनजान होना है जिसके लिए तर्क पारित किए जा रहे हैं।

ध्यान दें कि हमने पूर्ण कमांड स्ट्रिंग पर escapeshellcmd का उपयोग नहीं किया है। हमने '> output.txt' भाग छोड़ा ताकि '>' बच निकला न हो।

निष्कर्ष:

  • कोशिश आदेश पंक्ति तर्क के रूप में तार गुजर रहा से बचने के लिए। इसके बजाय, फ़ाइलों को डेटा लिखें और फ़ाइलों से पढ़ें। इस तरह आप यह सुनिश्चित कर सकते हैं कि पास किया जा रहा डेटा असम्बद्ध रहता है।

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

  • यदि आपको पूरी स्ट्रिंग पर escapeshellcmd का उपयोग करके पूरी तरह से कमांड लाइन तर्क के रूप में तारों को पारित करने की आवश्यकता है, तो अपेक्षाकृत सुरक्षित है।

+0

यह वह एवर है जिसे मैं ढूंढ रहा हूं। धन्यवाद। – Interfector

+1

ओएस एक्स पर PHP 5.5.18 में, पहला उदाहरण (जो केवल '$ arg1' पर 'escapeshellarg' का उपयोग करता है) output.txt पर सही ढंग से" टेस्ट \ 0ING "आउटपुट करता है। उस स्थिति में, क्या इन उदाहरणों में 'escapeshellarg'' के बजाय 'escapeshellcmd' का उपयोग करने का कोई कारण है? –

+0

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

1

मैं What's the difference between escapeshellarg and escapeshellcmd? जो आगे प्रत्येक की खूबियों के बारे में कुछ विवरण में चला जाता है का उल्लेख होगा।

मुझे लगता है कि फॉलो-अप का मानना ​​है, मैं कहूंगा कि इस उपयोगकर्ता इनपुट को स्वीकार करना और इसे केवल एसीसीएपीएचएलसीएमडी के साथ खोल में फेंकना शायद खराब तरीके से खत्म हो रहा है। मैं स्वच्छता और इनपुट सत्यापन पर ध्यान केंद्रित करूंगा, और उपरोक्त कार्यों को इस कोड के लिए अपनी सुरक्षा प्रक्रिया में 'अंतिम भाग' के रूप में उपयोग करूंगा।

+2

यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता है। भागने पर, क्या मुझे उन दोनों का उपयोग करना चाहिए या नहीं? जब एकमात्र उपयोगकर्ता प्रदान किया गया डेटा डेटा को एक सेगमेंट में जाता है, तो क्या मुझे एस्केपेशेलर के शीर्ष पर भी भाग लेना चाहिए, या पर्याप्त से बच निकलना चाहिए, क्योंकि तर्क कह सकता है? – Interfector

2

तो मुझे लगता है कि escapeshellcmd एक से अधिक कमांड चलाने से रोकता है।

escapeshellcmd() स्ट्रिंग में किसी भी वर्ण से बच निकलता है जिसका उपयोग मनमानी आदेशों को निष्पादित करने में शेल कमांड को चालित करने के लिए किया जा सकता है।

escapeshellarg यह सुनिश्चित करना है कि उपयोगकर्ता द्वारा प्रदान किया गया तर्क केवल एक तर्क है।

escapeshellarg() एक स्ट्रिंग और उद्धरण के आसपास एकल उद्धरण कहते हैं/आप एक खोल कार्य करने के लिए सीधे एक स्ट्रिंग पारित करने के लिए अनुमति देता है और यह एक एकल सुरक्षित तर्क के रूप में व्यवहार किया जाना होने से किसी भी मौजूदा एकल उद्धरण निकल जाता है।

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

अस्वीकरण: यह सिर्फ दस्तावेज़ीकरण की मेरी व्याख्या है।

संपादित करें:

मैं मानता हूँ कि दस्तावेज़ यहां अत्यंत भ्रामक है।मुझे लगता है कि चेतावनी जिसका अर्थ है कि एक पूरी कमान के आसपास इस लपेटकर एक तर्क

actualArg -someEvilFlag

या

actualArg -someEvilFlag evilFlagArgument 
+0

मुझे नहीं लगता कि यह कई कमांड को निष्पादित होने से रोकता है, हालांकि अगर मैं कमांड पर नियंत्रण करता हूं तो मैं केवल escapeshellarg का उपयोग करने के साथ सहमत हूं। लेकिन, चेतावनी का मतलब क्या है, इससे कोई अर्थ नहीं आता ??? यह कहने जैसा है, यह अच्छा है कि आपने escapeshellarg का उपयोग किया है, लेकिन यदि आप सुपर बनना चाहते हैं, तो उबर सुरक्षित है, बस escapeshellcmd के साथ सबकुछ से बचें। – Interfector

+1

@ इंटरफेक्टर मैं मानता हूं कि दस्तावेज यहां बेहद उलझन में है। मुझे लगता है कि चेतावनी यह है कि यह एक पूर्ण कमांड के चारों ओर लपेटने से उपयोगकर्ता को इस तरह की किसी तर्क का उपयोग करने से रोक नहीं पाएगा, 'realArg -someEvilFlag' या 'actualArg -someEvilFlag evilFlagArgument' – thatidiotguy

+0

यह केवल तार्किक स्पष्टीकरण की तरह लगता है। क्या आप इसे उत्तर के रूप में लिख सकते हैं? – Interfector

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