Titel umgeschrieben als: Hochgeladene Dateien können nicht verschoben werden, wenn die Berechtigungen nicht ausreichen
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.