PHP die Berechtigung erteilen, in Dateien und Ordner zu schreiben

PHP die Berechtigung erteilen, in Dateien und Ordner zu schreiben

ZUR WEITEREN KLARHEIT AKTUALISIERT:

Entsprechendhttp://expressionengine.com/user_guide/installation/installation.html, es sagt:

Für die meisten Unix-Hosts ist das Folgende typisch, aber Sie können mit Ihrem Host abklären, ob restriktivere Berechtigungen verwendet werden können, umPHP das Schreiben in Dateien (666) und Ordner (777) erlauben. Auf Windows-Servern gilt das Folgende nicht, aber Sie müssen sicherstellen, dass die Dateien und Ordner von ExpressionEngine beschreibbar sind. Möglicherweise müssen Sie hierfür Ihren Host kontaktieren.

Ich bin mir nicht sicher, was das bedeutet. Ich kann die spezifischen Dateien und Ordner, in denen ich der Chown bin, auf 666 bzw. 777 ändern, aber das Obige klingt, als müsste ich PHP auch erlauben, dies zu tun?

URSPRÜNGLICHE FRAGE:

Ich muss sicherstellen, dass PHP in bestimmte Dateien (666) und Ordner (777) schreiben kann.

Wie mache ich das?

Antwort1

Ich werde die Antworten von rahmu und MV mit einer technischen Lösung ergänzen. Alles, was folgt, gilt nur für UNIX-ähnliche Systeme.

Scrollen Sie über den Abschnitt „chmod/chown“ hinaus, um ein Beispiel mit ACLs anzuzeigen – ein leistungsfähigeres Tool als UNIX-Dateimodi.

So finden Sie den Benutzernamen Ihres Webservers

Zunächst müssen Sie den Benutzernamen kennen, unter dem Ihr Webserver läuft. Wenn Sie Apache verwenden, kann dies apacheoder httpd, www-data, usw. sein. Auf den meisten Debian-ähnlichen Systemen ist Apache www-data. Für nginx ist es im Allgemeinen auch www-data.

Um es auszuprobieren, versuchen Sie:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

Stellen Sie sicher, dass der Benutzername, den dieser Befehl zurückgibt, kohärent ist(Beispielsweise verwende ich 99 % der Zeit nginx, aber dieser Befehl gibt zurück tomcat7, einen Java-Webserver, den ich einmal installiert habe).


Berechtigungen für den Webserver erteilen: Verwenden chmodundchown

Die Verwendung chmodvon 666 oder 777 (die Standardlösung für diese Art von Problemen in schlechten Dokumentationen/Tutorials) kann die Dinge auf magische Weise zum Laufen bringen, ist aber unsicher. Die Erteilung der Berechtigungen 666 oder 777 gewährt „anderen“ Zugriff. Also nicht nur Apache, sondern auch grandmotherund nsa(vorausgesetzt, diese Benutzerkonten existieren auf Ihrem Computer – aber nein, wirklich, vermeiden Sie dies bitte, es sei denn, es dient nur zum Testen/Fehlerbeheben).

Es ist besser, spezifischer zu sein und nur Ihnen und Apache Berechtigungen zu erteilen. Ändern Sie die Gruppe Ihrer Dateien, um dem Webserver die volle Kontrolle über Ihre Dateien zu geben. Ändern Sie dazu den Besitzer rekursiv:

chown -R www-data:www-data your/folder/

Höchstwahrscheinlich möchten Sie jedoch den vollen Zugriff auf Ihre Dateien behalten, indem Sie nur die Gruppe ändern:

chown -R yourusername:www-data your/folder/

Führen Sie dann die entsprechenden Schritte aus, chmodum der Gruppe die gleichen Berechtigungen wie Ihnen zu erteilen www-data. Wenn der aktuelle Modus beispielsweise 640 ist(6 für Sie, 4 für www-Daten, 0 für andere, übersetzt in -rw-r-----), setze es auf 660(6 für Sie, 6 für www-Daten, 0 für andere, übersetzt in -rw-rw----). Weitere Informationen zu Dateimodi finden Sie in der Antwort von Rahmu. Es handelt sich dabei um einen alten, jedoch eleganten Mechanismus.

Um die Manipulation geheimnisvoller Zahlen mit zu vermeiden chmod, können Sie auch diese Syntax verwenden:

chmod -R g+rw your/folder/

Es bedeutet „Fügen Sie der Gruppe ( g) rekursiv ( +) Lese- und Schreibberechtigungen ( rw) für den Ordner hinzu your/folder/( -R).“

In 90 % der Fälle sollte dies ausreichen.


Meine bevorzugte Methode: Verwendung von ACLs (Access Control List)

Manchmal reicht die erste Lösung nicht aus. Ich nehme das Beispiel vonSymfony-Frameworkdas viele Daten protokolliert und zwischenspeichert. Es benötigt daher Schreibzugriff auf den entsprechenden Ordner.

Und die chmod/ chown-Methode reicht möglicherweise nicht aus, wenn Sie die Symfony-Konsole in der CLI (unter meinem Benutzerkonto) und das Web (Webserver-Benutzer) parallel verwenden. Dies verursacht viele Probleme, da Symfony ständig die Berechtigungen ändert.

In diesem Fall verwenden wir die ACL (Access Control List), eine erweiterte Möglichkeit zum Verwalten von Berechtigungen auf vielen UNIX-Systemen.

Hier die Befehle aus der offiziellen Symfony-Dokumentation (Bitte ändern app/cacheund app/logsan Ihre Bedürfnisse anpassen):

Auf einem System, das dies unterstützt chmod +a(also nicht Debian/Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

Auf einem System, das nicht unterstützt chmod +a(am häufigsten)

Sie werden das Tool benötigen setfacl. Möglicherweise ist es standardmäßig auf Ihrem System installiert. Versuchen Sie in diesem Fall setfacl -vherauszufinden, ob der Befehl verfügbar ist.

Wenn der Befehl nicht verfügbar ist,UndSie verwenden Ubuntu 14.04+, dann müssen Sie nur das Tool installieren:

sudo apt install acl

Andernfalls folgen Sie der Dokumentation Ihres Betriebssystems, da Sie möglicherweise die Art und Weise ändern müssen, wie Ihre Partition eingebunden wird (Ubuntu-Dokumentation hier).

Und da sind wir:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

Ich hatte mit dieser Methode nie Probleme, bin zufrieden und bekomme mein Geld zurück.

Antwort2

Egal, wer der Eigentümer der Dateien ist, 666 Berechtigungen und 777 würden ausreichen: Die letzte Ziffer stellt sicher, dassjedenBenutzer auf dem System hat Zugriff. Dies ist zwar die einfachste Methode, aber aus genau diesem Grund definitiv nicht die sicherste.

Eine bessere Möglichkeit, es zu tun

Das erste, was Sie verstehen müssen, istwie Unix-Berechtigungen funktionieren. Zum besseren Verständnis meiner Antwort unter diesem Link beachten Sie bitte, dass Berechtigungen in Zahlen übersetzt werden können:

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

A chmod 666ist dann gleichbedeutend mit der Änderung der Berechtigungen in rw-rw-rw.

Als nächstes müssen Sie herausfinden, welcher Benutzer das PHP-Skript ausführt. Normalerweise wäre das der Benutzer, der Ihren Webserver betreibt.Hier ist ein Beispiel dafür, wie das geht(Sie können Apache durch den Namen Ihres Webservers ersetzen).

Sobald Sie wissen, welcher Benutzer die Skripte ausführt und wer der Eigentümer der von Ihnen erwähnten Dateien ist, liegt es an Ihnen, die entsprechenden Berechtigungen festzulegen. Denken Sie daran, dass Schreibzugriff (sogar Lesezugriff) aufjedenBenutzer auf Ihrem System kann möglicherweise katastrophale Folgen haben.

Antwort3

Expression Engine ist wie viele andere PHP-Webanwendungen, die Lese- und Schreibzugriff auf einige Dateien und Verzeichnisse benötigen. Beispielsweise benötigt EE Schreibzugriff auf seine Dateien config.php und database.php sowie Schreibzugriff auf seine Dateiuploadverzeichnisse.

In der Dokumentation heißt es: Da die meisten Server PHP als mod_php ausführen (und somit mit den Berechtigungen des Webservers laufen) und Sie Ihre Dateien wahrscheinlich per FTP (oder ähnlichem) unter Verwendung Ihres eigenen Benutzers hochladen, benötigen diese Dateien und Verzeichnisse die Berechtigungen 666 (jeder kann lesen und schreiben) und 777 (jeder kann lesen, schreiben und browsen).

Dies ist zwar nicht der sicherste Weg, aber sicherlich der einfachste, insbesondere wenn Sie einen Hosting-Dienst verwenden.

Wie in den EE-Anweisungen angegeben, sollten Sie jedoch Ihren Hosting-Anbieter fragen, da einige nicht mod_php, sondern eine Fastcgi-, Suphp- oder andere Version verwenden. Diese Server führen PHP als Ihren eigenen Benutzer aus, sodass alle von Ihnen hochgeladenen Dateien bereits von PHP und allen von den EE-Skripten erstellten Dateien gelesen und geschrieben werden können. In diesem Fall müssten Dateien und Verzeichnisse, auf die von PHP zugegriffen wird, die Zugriffsrechte 600 und 700 erhalten. Andere Dateien, auf die direkt vom Webserver (nicht von der PHP-Laufzeit) zugegriffen wird, benötigen weiterhin die Zugriffsrechte 666 und 777.

verwandte Informationen