2012-07-22 7 views
5

अनुमति मैं एक पृष्ठ पर is_dir करने के लिए कुछ कॉल नहीं है। उन्होंने हमेशा कोई समस्या नहीं बनाई है।पीएचपी: open_basedir पथ

कुछ दिन पहले, होस्टिंग कंपनी 5.2 से 5.3 के लिए पीएचपी उन्नत बनाया। तब से, is_dir करने के लिए अपने सभी कॉल्स निम्न त्रुटि (संदेश) के परिणामस्वरूप:

Warning: is_dir(): open_basedir restriction in effect. 
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/) 
is not within the allowed path(s): 
(/home/virtual/domain.com:/home/virtual/_tmp) 
in /home/virtual/domain.com/public_html/index.php on line 201 

यह पहेली मुझे।

जाहिर है, (ताकि उपनिर्देशिकाएं कोई स्लैश के साथ,) त्रुटि संदेश (और php_info रूप में अच्छी तरह), निर्देशिका /home/virtual/domain.com शामिल किया गया है/open_basedir में सक्षम है, और फ़ाइलों को is_dir के अनुसार के माध्यम से पुनरावृति सब कर रहे हैं करने के लिए कोशिश कर रहा है उस फ़ोल्डर के नीचे subfolders में स्थित है। तो वे अनुमति पथ के भीतर क्यों नहीं हैं? स्पष्ट रूप से वे हैं!

अजीब पर्याप्त, यह त्रुटि प्रकट होता है के लिए एक ही करते समय दिखाई देते is_dir रिटर्न झूठी, जैसे कि, जब फ़ाइल नहीं एक फ़ोल्डर है, लेकिन एक नियमित रूप से फ़ाइल है। ऐसा लगता है कि त्रुटियों को फेंकने के बिना सभी निर्देशिकाओं के माध्यम से फिर से शुरू होता है।

इसी प्रकार के सवाल पहले से यहां पोस्ट: Open_basedir restriction oddness (कोई समाधान नहीं मिला)।

किसी के पास कोई विचार है?

(नोट: पीएचपी सेटिंग बदलने से एक विकल्प के रूप में इसे एक साझा मेजबान है और मैं किसी भी व्यवस्थापक पहुँच नहीं है नहीं है)

+0

इस वास्तविक त्रुटि संदेश है करता है? या कुछ पथ में कुछ विशेष पात्र हैं? – SteAp

+0

कुछ पथों में कुछ विशेष वर्ण होते हैं: '&' (एम्परसैंड) और '_' (अंडरस्कोर)। लेकिन त्रुटि उन पथों के लिए भी प्रकट होती है जिनमें कोई विशेष वर्ण नहीं होता है (जब तक कि अपरकेस अक्षर विशेष वर्णों के रूप में न हों)। और विशेष वर्ण सभी निर्देशिका नामों में हैं (और सही ढंग से पार्स किए गए हैं और उन मामलों में पुनरावृत्त हैं जहां 'is_dir'' TRUE' का मूल्यांकन करता है), फ़ाइल नामों में कभी नहीं (जहां त्रुटि होती है)। –

उत्तर

4

वहाँ PHP में unfixed बग है कि जब आप खोल सकते हैं या पथ उपसर्ग के रूप में एक विद्यमान फ़ाइल है कि जाँच शुरू हो रहा है, और प्रत्यय के रूप में नहीं के बराबर हिस्सा है। आपके उदाहरण में मौजूदा भाग /home/virtual/domain.com/public_html/galleries/img/002.JPG मौजूद है, जिसमें मौजूदा प्रत्यय / (पथ में पीछे हटना) नहीं है।

वहाँ स्पष्टीकरण यह है कि यह एक बग नहीं है: "यह अपेक्षित व्यवहार। एक गैर पथ जो अस्तित्व में नहीं है (स्लैश वाला एक) को आधार के बाहर माना जाता है। ", लेकिन मुझे ऐसा नहीं लगता है। यह बग केवल तभी ट्रिगर होता है जब पथ का पहला भाग एक मौजूदा फ़ाइल है।

पीएचपी कीड़े:

3

बाहर कर देता है इस सवाल का जवाब सुपर सरल, अभी तक पूरी तरह से अतार्किक था:

जब बनाने (श्रृंखलाबद्ध) रास्तों के माध्यम से पुनरावृति करने के लिए, मैं किसी कारण से हार्ड-कोडेड था स्लैश-ध्यान दें कैसे पथ ऊपर अंत में एक स्लैश के साथ img/002.JPG/ में समाप्त होता है। इस स्लैश को हटाने से त्रुटि ठीक हुई। यह भी बताता है कि यह निर्देशिकाओं में विफल क्यों नहीं हुआ (जो पीछे की ओर झुका हुआ है), केवल फाइलें (जो नहीं हैं)।

PHP दस्तावेज़ों के अनुसार क्या जाना है, is_dir()TRUE वापस लौटना चाहिए यदि निर्दिष्ट पथ किसी मौजूदा निर्देशिका का प्रतिनिधित्व करता है; और FALSE अन्य सभी मामलों में, जिसमें निर्दिष्ट फ़ाइल मौजूद नहीं है (जो img/002.JPG/ नहीं है)।

तो मैं अभी भी एक सा कारण है कि यह सिर्फ वापस नहीं किया था FALSE जिस तरह से यह पीएचपी 5.2 में करने के लिए इस्तेमाल करने के लिए के रूप में हैरान हूँ, लेकिन बजाय इस बल्कि गूढ़ और स्पष्ट रूप से अभी पूरी तरह गलत बयान करता है कि फ़ाइल नहीं है अनुमत पथ के भीतर ... लेकिन कम से कम यह फिर से काम करता है।