Titel umgeschrieben als: Hochgeladene Dateien können nicht verschoben werden, wenn die Berechtigungen nicht ausreichen
P粉210405394
P粉210405394 2023-09-07 23:51:33
0
1
470

Ich habe ein PHP-Skript, mit dem ich eine Datei hochladen kann, und versuche, sie von /tmp nach test/ zu verschieben (relativer Pfad, befindet sich in meinem Projektordner, zum Beispiel wäre /var/www/html/myproject/test absolut Weg). Wenn das passiert, erhalte ich die folgende Fehlermeldung.

move_uploaded_file(test/test.csv): Stream kann nicht geöffnet werden: Berechtigung verweigert unter /var/www/html/myproject/import.php, Zeile .php

Dieses Skript wird vom Apache-Benutzer ausgeführt, der Eigentümer von /test ist (sowohl der Apache-Besitzer als auch die Apache-Gruppe besitzen dieses Verzeichnis) und über RWX-Berechtigungen verfügt.

Ich habe Folgendes überprüft:

  • safe_mode ist deaktiviert.
  • open_basedir ist nicht gesetzt.
  • file_uploads ist aktiviert.
  • upload_max_filesize beträgt 2 MB, die Dateigröße beträgt ~50 KB.
  • post_max_size beträgt 8 MB und meine POST-Anfragen erreichen nicht annähernd diesen Wert.
  • Verwenden Sie absolute Pfade anstelle relativer Pfade.
  • is_dir("test/") gibt true zurück.
  • is_writable("test/") gibt false zurück.
  • Im PHP-Skript: Dateibesitzer (zu verschiebende Datei), Ordnerbesitzer (test/), Dateiberechtigungen und Ordnerberechtigungen drucken. Der Datei-/Ordnerbesitzer wird als Apache angezeigt. Die Dateiberechtigungen betragen 600, sodass der Eigentümer lesen und schreiben kann. Die Ordnerberechtigungen sind 755, sodass der Besitzer lesen, schreiben und ausführen kann.
  • ps -aux |. grep apache. Ordnen Sie die PID im Apache-Fehlerprotokoll einem laufenden Prozess zu, der dem Apache-Benutzer gehört. Dies bestätigt also, dass der Prozess unter Apache ausgeführt wird.
  • getcwd() und __DIR__ geben beide das richtige Verzeichnis /var/www/html/myproject zurück.
  • dirname(__FILE__) gibt den korrekten absoluten Pfad zur Datei zurück
  • Überprüfen Sie, ob file_exists($_FILES['file']['tmp_name']) true zurückgibt
  • Die Überprüfung von $_FILES['file']['error'] (der Datei, die ich verschieben möchte) gibt 0 zurück, kein Problem beim Hochladen.
  • Verwenden Sie is_writable("/tmp"), um zu prüfen, ob der Quellordner (/tmp) beschreibbar ist, und geben Sie true zurück.
  • Es wurde versucht, chmod -R 777 vorübergehend bei test/ zu verwenden, es wird immer noch angezeigt, dass die Berechtigung verweigert wurde und nicht beschreibbar ist.
  • Antivirus/EDR vorübergehend deaktiviert
  • Überprüfen Sie den Sicherheitskontext von „test/“. Das Rückgabeergebnis ist: „unconfined_u:object_r:httpd_sys_content_t:s0“. Nichts davon stellt ein Problem dar (erklärt in der Antwort unten).
  • Überprüfen Sie, ob Sie sicherheitsrelevante Anwendungen installiert haben, die möglicherweise das Verschieben von Dateien blockieren. Diese Anwendungen sind nicht installiert: AppArmor, grsecurity, Tomoyo Linux und Smack.
  • Habe die Funktionen fopen()/flock() im PHP-Skript verwendet, um zu bestätigen, dass die Datei, die ich verschieben möchte, nicht gesperrt ist.
  • Die Verwendung der Funktion is_uploaded_file() bestätigte, dass ich versuchte, eine hochgeladene Datei zu verschieben (ich war zu diesem Zeitpunkt verrückt geworden, weil ich einfach alles versucht hatte, was mir einfiel). Dies gibt natürlich true zurück.

P粉210405394
P粉210405394

Antworte allen(1)
P粉564192131

move_uploaded_file需要两个参数。 1:你想要上传的文件 2:放置文件的绝对路径 3:请确保上传目录具有适当的所有权和权限(注意:如果您使用Apache作为代理,目录所有权应属于apache2的用户:组)。

示例:move_uploaded_file($_FILES['my_file_field_name']['tmp_name'], "/var/www/html/myproject/test/upload_dir/" . $_FILES['name']['tmp_name']);

阅读更多:https://www.php.net/manual/pt_BR/function.move-uploaded-file.php

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage