टीएल; डीआर - फिक्स (जिसकी आपको आवश्यकता भी नहीं हो सकती है) बहुत ही सरल है और इस उत्तर के अंत में है।
मैं आपके विशिष्ट प्रश्नों को संबोधित करने का प्रयास करूंगा, लेकिन PATH_INFO की आपकी गलतफहमी सवालों को खुद ही थोड़ा गलत कर देती है।
पहला सवाल यह होना चाहिए कि "यह पथ सूचना व्यवसाय क्या है?"
आपका अगला प्रश्न यह होना चाहिए: "PHP कैसे निर्धारित करता है PATH_INFO
और क्या SCRIPT_FILENAME
हैं?"
- PHP के पहले के संस्करण भोले थे और तकनीकी रूप से भी समर्थन नहीं करते थे
PATH_INFO
, इसलिए माना जाता था कि PATH_INFO
जिस पर मंगाया गया था SCRIPT_FILENAME
, हाँ, कई मामलों में टूट गया है। मेरे पास परीक्षण करने के लिए PHP का पुराना पर्याप्त संस्करण नहीं है, लेकिन मेरा मानना है कि उसने SCRIPT_FILENAME
पूरे शेबंग के रूप में देखा : "/ path/ to/ script.php/THIS/IS/PATH/INFO" उपरोक्त उदाहरण में (पहले से docroot हमेशा की तरह)।
- Cgi.fix_pathinfo सक्षम होने के साथ, पीएचपी अब सही तरीके से पाता है "/ यह / है / path / जानकारी" के ऊपर के उदाहरण के लिए और इसे में डालता है
PATH_INFO
और SCRIPT_FILENAME
सिर्फ बात यह है कि अनुरोध किया जा रहा स्क्रिप्ट (बेशक docroot उपसर्ग के साथ) के लिए अंक हो जाता है।
- नोट: जब PHP वास्तव में समर्थन करने के लिए चारों ओर हो गया
PATH_INFO
, तो उन्हें नई सुविधा के लिए कॉन्फ़िगरेशन सेटिंग जोड़ना पड़ा ताकि पुराने व्यवहार पर निर्भर स्क्रिप्ट चलाने वाले लोग नए PHP संस्करण चला सकें। इसलिए इसके लिए कॉन्फ़िगरेशन स्विच भी है। इसे शुरू से ही अंतर्निहित ("खतरनाक" व्यवहार के साथ) होना चाहिए था।
लेकिन PHP कैसे जानती है कि स्क्रिप्ट किस भाग की है और यह पथ की जानकारी क्या है? क्या होगा यदि URI कुछ इस तरह है:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
- यह कुछ वातावरणों में एक जटिल प्रश्न हो सकता है। PHP में क्या होता है कि यह URI पथ का पहला भाग पाता है जो सर्वर के डॉक्रोट के तहत किसी भी चीज के अनुरूप नहीं है। इस उदाहरण के लिए, यह देखता है कि आपके सर्वर पर आपके पास "/droroot/path/to/script.php/THIS" नहीं है, लेकिन आपके पास निश्चित रूप से "/ docroot/path/to/script.php" है, इसलिए अब
SCRIPT_FILENAME
निर्धारित किया गया है और PATH_INFO
बाकी मिलता है।
- तो अब खतरे का अच्छा उदाहरण है जो कि नग्नेक्स डॉक्स में और हिरोज़े ( पोलर के जवाब में विस्तृत है (आप इस तरह के स्पष्ट उदाहरण के बारे में उधम मचाते नहीं हो सकते हैं) और भी स्पष्ट हो जाता है: हर्जो के उदाहरण (" http " // उदाहरण। com / foo.jpg / nonexistent.php "), PHP आपके docroot" /foo.jpg "पर एक फ़ाइल देखता है, लेकिन इसमें" /foo.jpg/nonexistent.php "नामक कुछ भी नहीं दिखता है, इसलिए इसे" /foo.jpg "कहा
SCRIPT_FILENAME
जाता है। (फिर से, डॉक्रोट के साथ उपसर्ग किया गया) और PATH_INFO
"/nonexistent.php" हो जाता है।
क्यों और कैसे खतरनाक हो सकता है यह अब स्पष्ट होना चाहिए:
- वेब सर्वर वास्तव में गलती पर नहीं है - यह केवल यूआरआई को PHP के लिए प्रॉक्सी कर रहा है, जो सहज रूप से पाता है कि "foo.jpg" में वास्तव में PHP सामग्री शामिल है, इसलिए यह इसे निष्पादित करता है (अब आपको pwned किया गया है!)। यह विशेष रूप से प्रति से Nginx के लिए नहीं है।
- असली समस्या यह है कि आप जाने अविश्वसनीय सामग्री sanitizing के बिना कहीं अपलोड किया और आप एक ही स्थान है, जो पीएचपी खुशी से जब यह कर सकते हैं कार्यान्वित करने के लिए अन्य मनमाना अनुरोध अनुमति देते हैं।
इस छलावे का उपयोग करके अनुरोधों को रोकने के लिए नेगनेक्स और अपाचे को बनाया या कॉन्फ़िगर किया जा सकता है, और ऐसा करने के लिए बहुत सारे उदाहरण हैं, जिसमें user2372674 का जवाब भी शामिल है । यह ब्लॉग लेख अच्छी तरह से समस्या की व्याख्या करता है, लेकिन यह सही समाधान याद आ रहा है।
हालांकि, सबसे अच्छा समाधान यह सुनिश्चित करना है कि PHP-FPM को सही ढंग से कॉन्फ़िगर किया गया है ताकि यह ".pp" के साथ समाप्त होने तक किसी फ़ाइल को निष्पादित न करे। यह ध्यान देने योग्य है कि PHP-FPM (~ 5.3.9 +?) के हाल के संस्करणों में यह डिफ़ॉल्ट रूप से है, इसलिए यह खतरा इतना अधिक समस्या नहीं है।
समाधान
यदि आपके पास PHP-FPM (~ 5.3.9 +?) का हालिया संस्करण है, तो आपको कुछ भी करने की आवश्यकता नहीं है, क्योंकि नीचे सुरक्षित व्यवहार पहले से ही डिफ़ॉल्ट है।
अन्यथा, php-fpm की www.conf
फ़ाइल ढूंढें (हो सकता है /etc/php-fpm.d/www.conf
, आपके सिस्टम पर निर्भर करता है)। सुनिश्चित करें कि आपके पास यह है:
security.limit_extensions = .php
फिर, यह इन दिनों कई स्थानों पर डिफ़ॉल्ट है।
ध्यान दें कि यह एक हमलावर को ".php" फ़ाइल को वर्डप्रेस अपलोड फ़ोल्डर में अपलोड करने और उसी तकनीक का उपयोग करने से रोक नहीं सकता है। आपको अभी भी अपने अनुप्रयोगों के लिए अच्छी सुरक्षा की आवश्यकता है।