move_uploaded_file() operation not permitted

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • move_uploaded_file() operation not permitted

    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:

    Code:
    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.
    Zuletzt geändert von Forrounce; 03.05.2018, 21:11.

  • #2
    Wie lautet die vollständige Fehlermeldung?

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        Zitat von Forrounce Beitrag anzeigen
        ...
        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:

        Code:
        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)
        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

        Kommentar


        • #5
          ja klar darfst du...

          Code:
          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/status
          Sprich, 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:
          Code:
          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:
          Code:
          ;open_basedir =
          ist gesetzt, sprich die Variable ist ausgeklammert. Daran kanns also nicht liegen.
          Zuletzt geändert von Forrounce; 05.05.2018, 14:33.

          Kommentar


          • #6
            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.

            Kommentar

            Lädt...
            X