2010-01-06 17 views
13

Ich habe ein PHP-Skript, das eine Verbindung zu einer Datenbank herstellen muss. Die Anmeldeinformationen für die Datenbank werden in einem anderen PHP-Skript gespeichert.Unix-Berechtigungen, lesen und ausführen (PHP-Kontext)

Wenn ich die Berechtigungen für die Credentials-Datei auf 661 setze, so dass Public Ausführungsberechtigung, aber keine Leseberechtigung hat, erlaubt dies dem Hauptskript, auf die Anmeldeinformationen zuzugreifen und eine Verbindung zur Datenbank herzustellen, während jemand mit einem Benutzerkonto verhindert wird Server den Inhalt der Anmeldeinformationsdatei anzeigen?

Ich denke, ich bin verwirrt über die Unterscheidung zwischen Lesen und Ausführen. Benötigt ein PHP-Skript (das als www oder ähnliches läuft) eine Leseberechtigung, um ein anderes PHP-Skript einzubinden und alle darin enthaltenen Inhalte zu verwenden? Oder muss es nur ausgeführt werden? Erlaubt die Leseberechtigung implizit die Ausführungsberechtigung?

Sub-Frage: Wenn ich alle meine Skripte nur ausführende Erlaubnis habe und nicht lesen, gibt es irgendwelche Fallstricke, die ich erwarten sollte? Dies setzt voraus, dass ich alle Dateien, die ich explizit lesen muss (Datendateien), auf Lesen setzen muss.

Antwort

9

Was die Dateien betrifft, ist die Ausführungsberechtigung für Sie irrelevant - das Benutzerkonto, unter dem Ihr Webserver läuft, benötigt die Erlaubnis, auf die betreffenden Dateien zuzugreifen und sie zu lesen. Um in ein Verzeichnis zu gelangen, benötigt der Benutzer auch eine Ausführungsberechtigung für dieses Verzeichnis.

Wenn Sie versuchen, Ihre Skripts vom Webserver lesbar zu machen (sagen wir, Sie laufen als das Konto "www", das zur Gruppe "www" gehört) und nicht von anderen Benutzern auf dem System, hier ist was ich tun würde (annimmt Ihr Konto ist „myuser“):

# Change owner to "myuser" and group to "www" for file(s) in question 
chown myuser:www config.php 

# 640: myuser has rw-, www has r--, world has --- 
chmod 640 config.php 

Wenn Sie die Welt aus der Lektüre jede Datei in einem „Geheimnisse“ Verzeichnis verhindern möchten, deaktivieren Sie einfach das Execute-Bit:

# 750: myuser has rwx, www has r-x, world has --- 
chmod 750 secrets 

Wenn Sie alle Skripte so einstellen, dass sie die Ausführungsberechtigung, aber nicht die Leseberechtigung haben, kann niemand etwas tun Ding nützlich mit ihnen (einschließlich der Webserver) ;-)

+0

Hinweis: Wenn andere Benutzer Zugriff auf ihren eigenen PHP-Code über den Webserver haben, wird dies sie nicht stoppen. In diesem Fall sollten Sie sich open_basedir ansehen oder eine Lösung, die es Ihnen ermöglicht, verschiedene vhosts/apps als unterschiedliche Benutzer zu verwenden. – oops

+0

Ja, bei näherer Betrachtung stellte ich fest, dass www ein Mitglied der Gruppe für das Verzeichnis war, auf das ich meine Verwirrung stützte. Ich habe nicht versucht, es zu hacken, ich wollte nur emulieren, was sie getan hatten, aber ohne es nur zu spiegeln. – Anthony

12

Skripte werden gelesen, nicht ausgeführt. Die Ausführungsberechtigung für Skripts weist den Loader oder Kernel an, die Shebang-Zeile zu lesen und das Skript an den benannten Interpreter zu übergeben.

+0

Also wenn ich ein Skript in einem Ordner namens "Geheimnisse" und Geheimnisse festgelegt haben, nur zum Ausführen, kann jemand, der einmal Lesezugriff auf Geheimnisse hatte (aber jetzt nicht) einen Dateinamen direkt auf etwas wie nano stecken und immer noch den Inhalt sehen? Das ist meine wirkliche Sorge, denke ich. – Anthony

+0

Wenn "secrets" ein Skript ist, kann es nicht ausgeführt werden, wenn der Benutzer, der den Interpreter ausführt, keinen Lesezugriff auf das Skript hat. Welche Berechtigungen es auch immer hatte, ist irrelevant; Das einzige Mal, wenn die Berechtigungen wichtig sind, ist es, wenn die Datei geöffnet wird, entweder zum Lesen oder zum Ausführen. –

Verwandte Themen