file-permissions chmod - Wie gebe ich PHP Schreibzugriff auf ein Verzeichnis?




recursive folder (10)

Ich versuche, PHP zu verwenden, um eine Datei zu erstellen, aber es funktioniert nicht. Ich nehme an, dies ist, weil es keinen Schreibzugriff hat (es war schon immer das Problem). Ich versuchte zu testen, ob das das Problem war, indem ich den Ordner chmod 0777 machte, aber das endete damit, dass jedes Skript in diesem Verzeichnis eine 500 Fehlermeldung zurückgab, bis ich es zurücksetzte. Wie gebe ich PHP Schreibzugriff auf mein Dateisystem, damit es eine Datei erstellen kann?

Bearbeiten: Es wird auf Hostgator Shared Hosting mit Apache gehostet.

Edit 2: Jemand fragte nach dem Code: Der Code ist ein GD-Bildskript. Ich weiß, dass der Rest davon so funktioniert, wie ich es vorher kreiert habe. Jetzt versuche ich, sie zu erstellen, wenn neuer Text hinzugefügt wird, und sie in einem Ordner zu speichern. Die Schreiblinie, die ich habe, ist: imagejpeg (null, $ file, 85);

Ich habe auch eine Testdatei erstellt, um zu prüfen, ob es nur ein kaputtes Skript war (hauptsächlich von Tizag kopiert): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (Ich weiß nicht, ob / wie ich posten soll der Code hier richtig. Hier ist der Inhalt des PHP-Skripts, abzüglich PHP-Tags.)

Es gibt 13,13,1 (separate Zeilen) zurück, also sieht es so aus, als ob es denkt, dass es etwas geschrieben hat, aber die Datei testfile.txt ist leer (ich habe eine leere hochgeladen) oder nicht vorhanden (wenn ich es lösche).

Edit 3: Der Server läuft CentOS.


Answers

Sie können selinux auf permissive setzen, um zu analysieren.

    # setenforce 0

Selinux protokolliert, erlaubt aber Zugriffe. Sie können das /var/log/audit/audit.log für Details überprüfen. Vielleicht wirst du selinux context ändern müssen. chcon Sie das chcon , werden Sie den Befehl chcon . Wenn Sie brauchen, zeigen Sie uns Ihr audit.log zur ausführlicheren Antwort.

Vergessen Sie nicht selinux zu aktivieren, nachdem Sie das Problem gelöst haben. Es sollte besser selinux durchgesetzt werden.

    # setenforce 1

Ich habe herausgefunden, dass man mit HostGator Dateien auf CMOD 644 und Ordner auf 755 setzen muss. Da ich dies auf Basis ihrer technischen Unterstützung gemacht habe, funktioniert es mit HostGator


1. Stellen Sie fest, welcher Benutzer den httpd-Prozess unter Verwendung des folgenden Befehls besitzt

ps aux | grep httpd

Sie erhalten eine Antwort auf mehrere Zeilen wie folgt:

phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd

Hier zeigt die erste Spalte den Benutzernamen. So, jetzt kennen Sie den Benutzer, der versucht, Dateien zu schreiben, das ist in diesem Fall phpuser Sie können jetzt phpuser und die Berechtigung für das Verzeichnis festlegen, in dem Ihr PHP-Skript versucht, etwas zu schreiben:

sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere

Mit chmod können Sie nicht den Besitz einer Datei festlegen. Um den Besitz der Datei festzulegen, müssen Sie den Befehl chown verwenden.


Der beste Weg, um Schreibzugriff auf ein Verzeichnis zu geben ..

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");

Ich hatte das gleiche Problem:

Da ich meinem php-Verzeichnis 0777 nicht geben wollte, erstelle ich ein tmp-Verzeichnis mit den Rechten 0777, wo ich die Dateien erstelle, zu denen ich schreiben muss.

Mein PHP-Verzeichnis ist weiterhin geschützt. Wenn jemand das tmp-Verzeichnis hackt, funktioniert die Seite wie gewohnt.


Ein sehr einfacher Weg ist, PHP das Verzeichnis selbst erst erstellen zu lassen.

<?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) {
     $oldmask = umask(0);  // helpful when used in linux server  
     mkdir ($dir, 0744);
 }

 file_put_contents ($dir.'/test.txt', 'Hello File');

Dies erspart Ihnen den Aufwand mit Berechtigungen.


Einfache 3-Stufen-Lösung

Zusammenfassung: Sie müssen den Besitzer des Verzeichnisses auf den Benutzer einstellen, den PHP verwendet (Webserver-Benutzer) .

Schritt 1: Bestimmen Sie den PHP-Benutzer

Erstellen Sie eine PHP-Datei, die Folgendes enthält:

<?php echo `whoami`; ?>

Laden Sie es auf Ihren Webserver hoch. Die Ausgabe sollte der folgenden ähneln:

www-data

Daher ist der PHP-Benutzer www-data .

Schritt 2: Ermitteln des Eigentümers des Verzeichnisses

Überprüfen Sie als Nächstes die Details des Webverzeichnisses über die Befehlszeile:

ls -dl /var/www/example.com/public_html/example-folder

Das Ergebnis sollte ähnlich wie folgt aussehen:

drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder

Daher ist der Besitzer des Verzeichnisses exampleuser1 .

Schritt 3: Ändern Sie den Verzeichnisbesitzer in PHP User

Ändern Sie anschließend den Besitzer des Webverzeichnisses in den PHP-Benutzer:

sudo chown -R www-data /var/www/example.com/public_html/example-folder

Stellen Sie sicher, dass der Besitzer des Webverzeichnisses geändert wurde:

ls -dl /var/www/example.com/public_html/example-folder

Das Ergebnis sollte ähnlich wie folgt aussehen:

drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder

Daher wurde der Besitzer des example-folder erfolgreich in den PHP-Benutzer geändert: www-data .

Erledigt! PHP sollte nun in das Verzeichnis schreiben können.


Sie können die Berechtigungen eines Ordners mit PHPs chmod () ändern. Weitere Informationen zur Verwendung des Befehls finden Sie hier: http://php.net/manual/en/function.chmod.php

Wenn Sie beim Festlegen der Berechtigungen auf 777 (schreibgeschützt) einen Fehler von 500 erhalten, bedeutet dies, dass Ihr Server so eingerichtet ist, dass die Ausführung solcher Dateien verhindert wird. Dies geschieht aus Sicherheitsgründen. In diesem Fall sollten Sie 755 als höchste Berechtigungen für eine Datei verwenden.

Wenn es eine error_log-Datei gibt, die in dem Ordner generiert wird, in dem Sie das PHP-Dokument ausführen, sollten Sie die letzten Einträge anzeigen. Dadurch erhalten Sie eine Idee, wo das Skript fehlschlägt.

Für Hilfe bei der Manipulation von PHP-Dateien verwende ich http://www.tizag.com/phpT/filewrite.php als Ressource.


Null-Coalesce-Operator "??" (In PHP 7 hinzugefügt)

Nicht der eingängigste Name für einen Operator, aber PHP 7 bringt das eher praktische Null-Zusammenführen mit, deshalb dachte ich, ich würde ein Beispiel teilen.

In PHP 5 haben wir bereits einen ternären Operator, der einen Wert testet und dann das zweite Element zurückgibt, wenn true zurückgegeben wird, und das dritte, wenn nicht:

echo $count ? $count : 10; // outputs 10

Es gibt auch eine Abkürzung, mit der Sie das zweite Element überspringen können, wenn es mit dem ersten Element identisch ist: echo $ count?: 10; // gibt auch 10 aus

In PHP 7 bekommen wir zusätzlich die ?? Ein Operator, der nicht extreme Verwirrung anzeigt, wie ich normalerweise zwei Fragezeichen verwenden würde, stattdessen können wir eine Reihe von Werten miteinander verketten. Beim Lesen von links nach rechts ist der erste Wert, der vorhanden ist und nicht Null ist, der Wert, der zurückgegeben wird.

// $a is not set
$b = 16;

echo $a ?? 2; // outputs 2
echo $a ?? $b ?? 7; // outputs 16

Dieses Konstrukt ist nützlich, um einem oder mehreren Werten, die möglicherweise von Benutzereingaben oder einer vorhandenen Konfiguration stammen, Priorität zu geben und sicher auf einen bestimmten Standard zurückzugreifen, wenn diese Konfiguration fehlt. Es ist eine Art kleines Feature, aber ich weiß, dass ich es verwenden werde, sobald meine Anwendungen auf PHP 7 aktualisiert werden.





php file-permissions chmod