php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
move_uploaded_file() operation not permitted


 
Forrounce
03-05-2018, 22:08 
 
Hallo auch,

aktuell habe ich ein Problem mit move_uploaded_file(). Ich möchte ein array von hochgeladenen Files verarbeiten. Dabei erhalte ich jedoch für jede der Dateien eine PHP Warning "Operation not permitted". Was mich wundert, ist, das die hochgeladenen Files dabei im Zielverzeichnis mir korrekten Berechtigungen angelegt werden. Im Temp sind demporären Datein hiernach auch verschwunden. Etwas gekürzt sieht man Code wie folgt aus:


if(isset($_FILES['imagefiles'])) {
foreach($_FILES['imagefiles']['error'] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES['imagefiles']['tmp_name'][$key];
$name = basename($_FILES["imagefiles"]["name"][$key]);
if(!move_uploaded_file($tmp_name, "$folder/$name")) {
$errmsg = 'Upload of "'.$folder."/".$name.'" failed. Please check permissions.';
}
}
}
}
move_uploaded_file ist immer true bzw. 1. Die Fehlermeldung $errmsg wird also nie befüllt. Am Zielort "$folder/$name" finde ich wie erwartet meine hochgeladenen Datei mit dem User www-data:www-data und den Rechten 0644. Im PHP errorlog finde ich dennoch für jeden Upload den Eintrag Operation not permitted.

Als Server arbeitet nginx und php-fpm unter Debian 9 auf einem Raspberry Pi. Setze ich vor move_uploaded_fileein @, werden die Meldungen im PHP Errrorlog unterdrückt. Provoziere ich hingegen einen Fehler in dem ich zum Beispiel den owner von $folder ändere, wird move_uploaded_file auf false gesetzt und $errmsg enthält die entsprechende Meldung.

Kann mir jemand erklären warum ich ohne @ die Warnung erhalte? Achja PHP Temp = System Temp und liegt auf /tmp. /tmp liegt in einer Ramdisk mit den Rechten 0777.

 
h3ll
04-05-2018, 11:06 
 
Wie lautet die vollständige Fehlermeldung?

 
Forrounce
04-05-2018, 11:15 
 
PHP Warning: move_uploaded_file(): The operation is not permitted in /var/www/pictures.php on line 12

Mehr habe ich leider nicht. Sonst gibt es keinerlei Anzeichen für Probleme. Ich verstehe es nur deswegen nicht, da es die Operation erfolgreich ausführt und der Rückgabewert der Funktion weiterhin true ist.

 
fireweasel
04-05-2018, 21:46 
 
...
move_uploaded_file ist immer true ...
Am Zielort "$folder/$name" finde ich wie erwartet meine hochgeladenen Datei mit dem User www-data:www-data und den Rechten 0644. Im PHP errorlog finde ich dennoch für jeden Upload den Eintrag Operation not permitted.
Darf man fragen, mit welcher PHP-Version du arbeitest? Ist da irgendwas abweichend vom Üblichen gepatcht?

Wenn man dem Quellcode aktueller PHP-Versionen folgt, dann ist das, was du beschreibst, ein Ding der Unmöglichkeit. Ein Rückgabewert von true kann niemals mit dieser Warnung einhergehen:

PHP_FUNCTION(move_uploaded_file)
{
char *path, *new_path;
size_t path_len, new_path_len;
zend_bool successful = 0;
// ...
// .. diverse checks, die ohne Meldung mit FALSE zurückkehren ...

if (VCWD_RENAME(path, new_path) == 0) {
successful = 1;
// ...
} else if (php_copy_file_ex(path, new_path, STREAM_DISABLE_OPEN_BASEDIR) == SUCCESS) {
VCWD_UNLINK(path);
successful = 1;
}

if (successful) {
zend_hash_str_del(SG(rfc1867_uploaded_files), path, path_len);
} else {
php_error_docref(NULL, E_WARNING, "Unable to move '%s' to '%s'", path, new_path);
}

RETURN_BOOL(successful);
}
(aus ext/standard/basic_functions.c (https://github.com/php/php-src/blob/master/ext/standard/basic_functions.c))

 
Forrounce
05-05-2018, 15:24 
 
ja klar darfst du...

apt-cache policy php7.0-fpm
php7.0-fpm:
Installiert: 7.0.27-0+deb9u1
Installationskandidat: 7.0.27-0+deb9u1
Versionstabelle:
*** 7.0.27-0+deb9u1 500
500 http://mirrordirector.raspbian.org/raspbian stretch/main armhf Packages
100 /var/lib/dpkg/statusSprich, ganz normal aus dem üblichen Repo. Lediglich Nginx ist seit letzter Woche auf 1.13, kommt aber aus den Backports. Alles andere ist Standard.

Ich verstehe es auch nicht. Da die Dateien aber im richtigen Verzeichnis landen und dort auch die richtigen Rechte vergeben werden, bin ich zumindest was mein PHP Script angeht relativ entspannt. Es wird ja bewegt/umbenannt, also ist die Operation erfolgreich, also kommt das Ding auch mit dem Ergebnis true zurück. Was er dann aber mit Operation not permited will, kann ich nicht erklären.

Hab jetzt das System mal auf deutscch umgestellt, da war ich bisher zu faul dazu. Damit erhalte ich auch die Meldung auf deutsch: PHP Warning: move_uploaded_file(): Die Operation ist nicht erlaubt in... Aber wiederum ist die Datei am Zielort angekommen.

Edit: Hab grad noch mal nach geschaut: ;open_basedir = ist gesetzt, sprich die Variable ist ausgeklammert. Daran kanns also nicht liegen.

 
Forrounce
05-05-2018, 21:45 
 
Ich glaube, ich habe das Problem gefunden. Irgendwie ist mein /tmp via symlink auf ein anderes device gemappt. Muss ich wohl irgendwann mal so eingestellt und wieder vergessen haben. Das gemappte andere Verzeichniss lag am Ende auf einem SMB Share. Dort waren zwar auch 0777 als Rechte aber scheinbar kommt PHP nicht damit klar. Die temporären Files wurden auch dorthin kopiert und wieder gelöscht. Keine Ahnung was es da noch zu meckern gab.

Lange Rede, kurer Sinn: Ich hab das php tmp Verzeichnis nun wieder auf dem lokalen ext4. Die Funktion bleibt weiterhin erhalten aber nun ohne Warning. Auch wenn ich das /tmp in die RAMdisk lege, funktioniert alles sauber. Der Idiot saß mal wieder vor dem PC. Vielleicht ist die Lösung ja für den ein oder anderen nützlich.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:59 Uhr.