2017-05-01 2 views
1

Ich versuche, eine Datei mit PHP in einem anderen Ordner hochgeladen zu bewegen, aber irgendwie wird dies nicht funktionieren, was zu:PHP: Datei kann nicht andere Ordner verschieben

move_uploaded_file(upload/tmp/phpxEGMLG): failed to open stream: Permission denied

Also, anscheinend Ich habe keine richtigen Berechtigungen für upload/tmp (die in der Tat ist /var/www/html/upload/tmp).

Ich habe Berechtigungen auf 777 und Besitzer root:root für /var/www/html/upload/tmp gesetzt, um absolut sicher zu sein, dass es kein Problem geben konnte.
Aber das war es nicht lösen ...

Andere Dinge, die ich habe versucht:

  • Set Besitzer apache:apache
  • Quelle ändern Dateiberechtigungen 777 und Besitzer root (standardmäßig Besitzer wird auf apache)
  • Überprüfung PHP-Einstellungen (ziemlich Standard, /var/www/html und /tmp innerhalb open_basedir sind, ist upload_tmp_dir nicht festgelegt) + l ogs
  • Überprüfen Apache Einstellungen + Protokolle
  • Verschieben der Datei im selben Ordner -> das funktioniert!
  • bewegen es in einem anderen anderen Ordner -> nicht
  • funktioniert Einstellung alle übergeordneten Verzeichnisse 777 und Inhaber root oder apache

Und ich erstellt ein Testskript:

<?php 

echo 'TESTING FILE MOVE' . '<br><br>'; 

echo getcwd() . '<br>'; 
echo get_current_user() . '<br>'; 

error_reporting(E_ALL); 

file_put_contents('/tmp/tst.txt', 'this is a test'); 
chdir('/var/www/html/upload/tmp'); 
echo getcwd() . '<br><br>'; 
rename('/tmp/tst.txt', 'tst-2.txt'); 

print_r(error_get_last()); 

Es gibt eine Ausgabe wie:

TESTDATEI MOVE

/var/www/html
root
/var/www/html/upload/tmp

Array ([Typ] => 2 [message] => Umbenennen (/tmp/tst.txt , tst-2.txt): Zugriff verweigert [file] => /var/www/html/test.php [line] => 13)

das sagt mir, unter welcher Benutzer das Skript ausgeführt wird und Ich bin im richtigen Verzeichnis. Es werden auch die zusätzlichen Prüfungen move_uploaded_file verwendet, die sich auf das Verschieben der Datei konzentrieren.

Einige Informationen über mein Setup:

  • CentOS 7
  • PHP 7.1
  • PHP-FPM
  • Apache 2.4.6

Es verwendet ein separates Temp-Verzeichnis für PHP-FPM, wie /tmp/systemd-private-xxxx-php71-php-fpm.service-yyyy/tmp/. Vielleicht gibt es einen Grund, warum es Dateien außerhalb dieses Verzeichnisses nicht verschieben kann? Ich kann jedoch nichts dabei finden ...

Ich hoffe, jemand kann mir einen Hinweis, was könnte los sein!

Antwort

0

Es stellt sich heraus SELinux sein.

mehr oder weniger die gleiche Frage beantwortet: https://unix.stackexchange.com/questions/50639/httpd-cant-write-to-folder-file-because-of-selinux

Ich habe den Webserver-Ordner Setup mit SELinux müssen Apache verfügbar sein, aber auch Schreib Lese-/FTP ermöglicht. Aber ich brauchte die upload Ordner (und Ordner darunter) einzustellen lesen zu ermöglichen/Schreiben von Apache, die durch so etwas wie dies erreicht werden kann (man beachte die rw Bit im Befehl):

chcon --user system_u --type httpd_sys_rw_content_t -R upload 

Auch ein handlich Befehl zur Überprüfung:

ls -Z 

Dies zeigt nun:

drwxr-xr-x. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 upload 
0

Besitzer des Verzeichnisses oder des Websers zu www-data ändern und sich zu www-data Gruppe hinzufügen, ausloggen oder neu starten.

sudo adduser <username> www-data 
sudo chown -R www-data:www-data /var/www 
sudo chmod -R g+rwX /var/www 

chown help und chmod help

+0

'www-data' nicht auf CentOS nicht existiert, es' apache' dort genannt wird, aber diese Befehle mit 'apach Ausführung e' statt 'www-data' löst es nicht ... – kasimir

Verwandte Themen