ich einen Bildprozessor PHP-Skript, und es enthält den folgenden Code:PHP is_readable für nicht lesbare Datei true zurück
if (!is_dir($fullFile)) {
if (is_readable($fullFile)) {
$im = getimagesize($fullFile); // Will be FALSE if not an image
In einigen Fällen wird das Skript bei getimagesize mit dem folgenden Fehler fehlschlagen:
getimagesize(/path/to/file.jpg) [function.getimagesize]: failed to open stream: Permission denied at www.yada.yada/page.php
In diesem Fall sind die Berechtigungen für /path/to/file.jpg definitiv unerschwinglich (400), so würde ich den is_readable Test zu diesem Zeitpunkt zu verhindern, erwartet immer ich. Abgesehen davon, Berechtigungen anders festzulegen, was kann ich tun, um dies zu beheben? Warum scheint is_readable ein falsches Ergebnis zu haben? Ist es möglich, dass is_readable mit der EUID des Dateibesitzers arbeitet, während getimagesize nicht ist? Das ist die einzige Erklärung, die für mich Sinn ergibt, aber selbst dieses Wissen hilft nicht bei der Lösung.
Angeregt durch @ hek2mgl habe ich diesen ultra-komplexen Skript, readable.php genannt:
<?php echo is_readable("/stora2/Pics/2009/2009-07-26/DSC00532.JPG") . "\n\n"; ?>
Dann Benutzer auf den Webserver Benutzer I eingeschaltet (eigentlich www-data auf diesem Server) und es lief. Ergebnis war
1
Dann lief ich strace als der gleiche Benutzer. Dies sind die Befehle, die ich benutzt habe. Das Ergebnis ist eine 70KB + Datei, und so wird mich nicht in seiner Gesamtheit lassen veröffentlichen, so ist es bei 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
Nicht sicher geschrieben, was ich suche. Bitte beraten.
* "Denken Sie daran, dass PHP auf die Datei als die Benutzer-ID zugreifen kann, auf der der Webserver läuft (oft 'niemand') . "* – Madbreaks
Das Ergebnis könnte auch zwischengespeichert werden. Versuchen Sie ['clearstatcache()'] (http://php.net/manual/en/function.clearstatcache.php) – Phil
Welcher Benutzer besitzt die Datei und unter welchem Benutzer läuft Ihr Webserver? –