Erteilung der PHP-Berechtigung zum Schreiben in Dateien und Ordner

13

AKTUALISIERT FÜR WEITERE KLARHEIT:

Laut http://expressionengine.com/user_guide/installation/installation.html heißt es:

Für die meisten Unix-Hosts ist Folgendes typisch. Sie können jedoch bei Ihrem Host nachfragen, ob restriktivere Berechtigungen verwendet werden können, damit PHP in Dateien (666) und Ordner (777) schreiben kann . Auf Windows-Servern gilt Folgendes nicht, Sie müssen jedoch sicherstellen, dass die Dateien und Ordner von ExpressionEngine beschreibbar sind. Möglicherweise müssen Sie sich hierzu an Ihren Gastgeber wenden.

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

URSPRÜNGLICHE FRAGE:

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

Wie mache ich das?

oshirowanen
quelle
2
Ich bin nicht sicher, welches Problem Sie lösen möchten? Wenn Sie auf das Verzeichnis zugreifen können, in dem sich die Datei befindet, und über Ausführungsberechtigungen verfügen, können Sie mit diesen Berechtigungen in Dateien und Verzeichnisse schreiben.
Karlson
Weitere Details oben hinzugefügt.
oshirowanen
1
Für die meisten Unix-Hosts ist Folgendes typisch. Sie können jedoch bei Ihrem Host nachfragen, ob restriktivere Berechtigungen verwendet werden können, damit PHP in Dateien (666) und Ordner (777) schreiben kann. Fehlt ein Koma? sonst macht dieser Satz keinen Sinn. Sofern das Verzeichnis einer höheren Ebene nicht eingeschränkt ist, können Sie problemlos in weltweit beschreibbare Dateien oder Verzeichnisse schreiben.
Karlson
Ich habe gerade eine Kopie aus der Dokumentation kopiert und eingefügt. Außerdem habe ich die Frage gestellt, weil ich nicht verstehe, was dieses Zitat bedeutet ...
oshirowanen
1
Wenn Sie eine Dokumentation sehen, die darauf hinweist, dass Sie 666 oder 777 in Bezug auf Webdateien verwenden, sollten Sie diese wahrscheinlich ignorieren, es sei denn, es gibt einen guten Grund. Es ist normalerweise etwas, das von jemandem geschrieben wurde, der nicht herausfinden konnte, wie die richtigen Berechtigungen eingerichtet werden sollen, und der aufgab und jedem Lese- oder Schreibzugriff auf die Dateien gewährte.
jsbillings

Antworten:

18

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

Scrollen Sie über den Abschnitt chmod / chown, um ein Beispiel mit ACLs zu erhalten - ein leistungsfähigeres Tool als die UNIX-Dateimodi.

Suchen des Benutzernamens Ihres Webservers

Zunächst müssen Sie den Benutzernamen kennen, unter dem Ihr Webserver ausgeführt wird. Wenn Sie Apache verwenden, kann es sein , apacheoder httpd, www-datausw. Auf den meisten Debian-ähnlichen Systemen, Apache ist www-data. Für Nginx ist dies im Allgemeinen auch der Fall www-data.

Versuchen Sie Folgendes:

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 (z. B. verwende ich 99% der Zeit nginx, aber dieser Befehl gibt tomcat7einen Java-Webserver zurück, den ich einmal installiert habe) .


Erteilen von Berechtigungen an den Webserver: Verwenden von chmodundchown

Das Ausführen chmodvon 666 oder 777 (die Lösung für diese Art von Problemen in schlechten Dokumentationen / Tutorials) kann auf magische Weise zum Funktionieren führen, ist jedoch unsicher. Wenn Sie 666 oder 777 Berechtigungen erteilen, erhalten Sie Zugriff auf "andere". Also nicht nur Apache, sondern auch grandmotherund nsa(vorausgesetzt, diese Benutzerkonten sind auf Ihrem Computer vorhanden - aber nein, bitte vermeiden Sie dies, es sei denn, es dient nur zum Testen / zur Fehlerbehebung).

Es ist besser, genauer zu sein und nur Ihnen und Apache Berechtigungen zu erteilen. Ändern Sie die Gruppe Ihrer Dateien, um dem Webserver die vollständige Kontrolle über Ihre Dateien zu geben. Ändern Sie dazu den Eigentümer rekursiv:

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

Höchstwahrscheinlich möchten Sie jedoch den vollständigen 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 chmod, um der Gruppe www-datadieselben Berechtigungen wie Ihnen zu erteilen . Wenn der aktuelle Modus beispielsweise 640 ist (6 für Sie, 4 für www-Daten, 0 für andere, übersetzt in -rw-r -----) , setzen Sie ihn auf 660 (6 für Sie, 6 für www- Daten, 0 für andere, übersetzt in -rw-rw ----) . In der Antwort von rahmu erfahren Sie mehr über Dateimodi. Es handelt sich um einen alten, jedoch eleganten Mechanismus.

Um zu vermeiden, dass arkane Zahlen mit manipuliert werden chmod, können Sie auch die folgende Syntax verwenden:

chmod -R g+rw your/folder/

Es bedeutet "zu der Gruppe ( g), +Lese- und Schreibberechtigung ( rw) für Ordner hinzufügen your/folder/, rekursiv ( -R)".

In 90% der Fälle sollte dies ausreichen.


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

Manchmal reicht die erste Lösung nicht aus. Ich nehme das Beispiel von Symfony Framework , das viele Daten protokolliert und zwischenspeichert. Es benötigt also Schreibzugriff auf den entsprechenden Ordner.

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

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

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

Auf einem System, das unterstützt chmod +a(dh 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 benötigen das setfaclWerkzeug; Möglicherweise ist es standardmäßig auf Ihrem System installiert. Versuchen Sie daher, festzustellen setfacl -v, ob der Befehl verfügbar ist.

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

sudo apt install acl

Befolgen Sie andernfalls die Dokumentation Ihres Betriebssystems, da Sie möglicherweise ändern müssen, wie Ihre Partition bereitgestellt 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 nie Probleme mit dieser Methode, zufrieden oder Ihr Geld zurück.

Morgan Touverey Quilling
quelle
1
+1 für 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | Kopf -1 | cut -d \ -f1 '
Amar Pratap
4

Unabhängig davon, wer der Eigentümer der Dateien ist, reichen 666 Berechtigungen und 777 aus: Die letzte Ziffer stellt sicher, dass jeder Benutzer im System Zugriff hat. Dies ist zwar der einfachste Weg, aber aus genau diesem Grund definitiv nicht der sicherste.

Ein besserer Weg, es zu tun

Das erste, was Sie verstehen müssen, ist, wie Unix-Berechtigungen funktionieren . Um die Antwort zu verstehen, die ich unter diesem Link gegeben habe, 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 666entspricht dann dem Ändern von Berechtigungen in rw-rw-rw.

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

Sobald Sie wissen, welcher Benutzer die Skripte ausführt und welcher der Eigentümer der von Ihnen genannten Dateien ist, müssen Sie die entsprechenden Berechtigungen festlegen. Beachten Sie, dass es potenziell katastrophal sein kann , jedem Benutzer auf Ihrem System Schreibzugriff (sogar Lesezugriff) zu gewähren .

Rahmu
quelle
0

Expression Engine ist genau 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 Datei-Upload-Verzeichnisse.

In der Dokumentation heißt es, dass auf den meisten Servern PHP als mod_php ausgeführt wird (und daher mit den Berechtigungen des Webservers ausgeführt wird) und Sie Ihre Dateien wahrscheinlich mit FTP (oder ähnlichem) unter Verwendung Ihres eigenen Benutzers, dieser Dateien und Verzeichnisse müssen die Berechtigungen 666 (jeder kann lesen und schreiben) und 777 (jeder kann lesen, schreiben und durchsuchen) erhalten.

Dies ist nicht der sicherste, aber sicherlich der einfachste Weg, insbesondere wenn Sie einen Hosting-Service nutzen.

Fragen Sie jedoch, wie in den EE-Anweisungen angegeben, Ihren Hosting-Anbieter, da einige nicht mod_php verwenden, sondern ein fastcgi, suphp oder eine andere Version. Auf diesen Servern wird PHP als Ihr eigener Benutzer ausgeführt, sodass alle von Ihnen hochgeladenen Dateien bereits von PHP und allen von den EE-Skripten erstellten Dateien gelesen und beschrieben werden können. In diesem Fall müssten Dateien und Verzeichnisse, auf die PHP zugreift, 600 und 700 Zugriff erhalten. Andere Dateien, auf die direkt vom Webserver zugegriffen werden soll (nicht die PHP-Laufzeit), benötigen weiterhin 666- und 777-Zugriff.

MV.
quelle