2013-01-09 13 views
5

मैं एक छवि प्रोसेसर PHP स्क्रिप्ट है के लिए सच देता है, और यह निम्नलिखित कोड शामिल हैं:पीएचपी is_readable गैर पठनीय फ़ाइल

 if (!is_dir($fullFile)) { 
      if (is_readable($fullFile)) { 
       $im = getimagesize($fullFile); // Will be FALSE if not an image 

कुछ उदाहरणों में, स्क्रिप्ट निम्न त्रुटि के साथ getimagesize पर विफल हो जाएगा:

getimagesize(/path/to/file.jpg) [function.getimagesize]: failed to open stream: Permission denied at www.yada.yada/page.php 

इस मामले में, /path/to/file.jpg के लिए अनुमतियां निश्चित रूप से निषिद्ध हैं (400), इसलिए मुझे उम्मीद है कि मुझे उस बिंदु पर जाने से रोकने के लिए is_readable test की उम्मीद है। अलग-अलग अनुमतियों को सेट करने के अलावा, इसे हल करने के लिए मैं क्या कर सकता हूं? ऐसा क्यों लगता है कि is_readable का गलत परिणाम है? क्या यह संभव है कि is_readable फ़ाइल मालिक के ईयूआईडी के साथ काम कर रहा है, जबकि getimagesize नहीं है? यही एकमात्र स्पष्टीकरण है जो मुझे समझ में आता है, लेकिन वह ज्ञान भी हल करने में मदद नहीं करता है।

<?php echo is_readable("/stora2/Pics/2009/2009-07-26/DSC00532.JPG") . "\n\n"; ?> 

तब मैं वेब सर्वर उपयोगकर्ता के लिए उपयोगकर्ता बंद (इस सर्वर पर वास्तव में www-डेटा) है और यह भाग गया:

@ hek2mgl से प्रेरित होकर मैं इस अति जटिल स्क्रिप्ट, readable.php नाम बनाया। परिणाम

1 

तब मैं उसी उपयोगकर्ता के रूप में स्ट्रेस चला गया। ये वे आदेश हैं जिनका मैंने उपयोग किया था। परिणाम एक 70KB + फ़ाइल है, और इसलिए मुझे अपनी संपूर्णता में इसे पोस्ट नहीं दूँगी, तो यह http://pastebin.com/mFqiSBiz

[email protected]:~$ sudo su - www-data 

$ ls -l "/stora2/Pics/2009/2009-07-26/DSC00532.JPG" 
-rw------- 1 dennis dennis 524288 2012-02-11 08:18 /stora2/Pics/2009/2009-07-26/DSC00532.JPG 

$ file "/stora2/Pics/2009/2009-07-26/DSC00532.JPG" 
/stora2/Pics/2009/2009-07-26/DSC00532.JPG: writable, regular file, no read permission 

$ php /home/dennis/readable.php 
1 

$ strace php /home/dennis/readable.php > /tmp/strace.out 2>&1 
नहीं

यकीन है कि मैं के लिए क्या देख रहा हूँ पर पोस्ट किया जाता है। कृपया सलाह दें।

+0

* "ध्यान रखें कि PHP फ़ाइल को उस उपयोगकर्ता आईडी के रूप में एक्सेस कर रहा है जिस पर वेब सर्वर चलता है (अक्सर 'कोई नहीं') "* – Madbreaks

+2

परिणाम भी कैश किया जा सकता है। कोशिश करें ['clearstatcache()'] (http://php.net/manual/en/function.clearstatcache.php) – Phil

+0

क्या उपयोगकर्ता फ़ाइल का मालिक है और आपका वेब सर्वर किस उपयोगकर्ता के रूप में चल रहा है? –

उत्तर

2

आप जिस PHP के संस्करण को चला रहे हैं उसके आधार पर, यह एक बग हो सकता है, क्योंकि हेक 2 एमजीएल ने टिप्पणियों में कहा था। यदि आप इसे वर्कअराउंड करना चाहते हैं, तो आप फ़ाइल अनुमतियों के आधार पर तर्क जोड़ सकते हैं, fileperms

+0

मुझे कूल्हे के पीछे मिल गया, धन्यवाद। मैंने उपयोग किया: >>> अगर (fileperms (और fullfile) और 0x04 == 0x04) {<<< >>> के स्थान पर (if_readable (और fullfile)) {<<< – Dennis

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