कम
- में कुछ इस तरह का उपयोग करने से एक उपयोगकर्ता बंद नहीं होंगे 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 का उपयोग करके पूरी तरह से कमांड लाइन तर्क के रूप में तारों को पारित करने की आवश्यकता है, तो अपेक्षाकृत सुरक्षित है।
क्या आपके द्वारा या उपयोगकर्ता द्वारा प्रदान किया गया आदेश है? तर्क - एक ही सवाल। – thatidiotguy
चलो दोनों मामलों को ध्यान में रखें: 1. 'ls $ arg'' 2.' $ cmd $ arg'' आप इन मामलों को संभालने के बारे में कैसे जाएंगे? – Interfector