2012-10-11 11 views
9

Ich weiß, dass die Frage How do I secure my database connection credentials? mehrfach gestellt und beantwortet wurde (z. B. How to secure database passwords in PHP?).Sichern von Datenbankverbindungsinformationen

Eine allgemein akzeptierte Antwort auf diese Frage ist, die Details außerhalb des Webstamms zu speichern. Aber ich bin neugierig, warum das wirklich viel Unterschied macht.

Von dem, was ich verstehe, kann eine Person nicht die Quelle der PHP-Datei über HTTP herunterladen (es sei denn, Ihr Web-Server ist nicht richtig konfiguriert, aber Sie würden sofort darüber wissen). Daher werden Sie die Anmeldeinformationen nur sehen können, wenn Sie Zugriff auf die Quelle der PHP-Datei haben. Korrigiere mich, wenn ich falsch liege, aber bedeutet das nicht grundsätzlich, dass du einen Shell-Zugriff benötigst? Und wenn Sie einen Shell-Zugang haben, können Sie nicht sowieso einfach zur Datei außerhalb des Web-Root gelangen?

Wenn die Antwort auf diese Frage ist, dass die Include-Datei spezielle Berechtigungen haben kann, die niemandem außer dem Webserver-Benutzer erlauben, es zu lesen, dann (kann ich Shell-Zugriff haben), konnte ich nicht einfach schreiben (oder modifizieren) irgendeine PHP-Datei, um nur diese Anmeldeinformationen auszusenden?

Also die Frage ist, macht es wirklich machen einen Unterschied, ob Sie die Anmeldeinformationen direkt im PHP-Skript vs. in einer Datei außerhalb des Web-Root speichern?

Antwort

8

Angenommen, der Webserver verarbeitet aufgrund eines Fehlers im Webserver keine PHP-Dateien mehr, sondern behandelt sie als HTML-Dateien.

In diesem Fall würde etwas wie http://mysite.com/config.php einfach die Anmeldeinformationen Ihrer Datenbank offenbaren.

Die Antwort lautet also: Ja, es spielt wirklich eine Rolle, wo und wie Sie die Datenbankanmeldeinformationen speichern.

+1

Ja das ist tatsächlich einmal mit Facebook passiert! http://techcrunch.com/2007/08/11/facebook-source-code-leaked/ – fire

+0

Oder verhindern Sie diesen Fehler: http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012- 1823/ – Tchoupi

+0

@Dev Die Frage war: * Warum sollten wir DB-Berechtigungsnachweise außerhalb der Webroot speichern? *. Dies beantwortet die Frage. – Tchoupi

5

Das Hauptproblem ist, dass der Webserver später möglicherweise zusammenbricht. Z.B. Nach einem Software-Update funktioniert PHP möglicherweise nicht mehr richtig und der Server greift auf die Bereitstellung der Dateien zurück. Oder nach einem Software-Update wird die Konfiguration möglicherweise zurückgesetzt, so dass PHP nicht mehr für die Dateierweiterung registriert ist. Oder der Server bricht unter hoher Last zusammen und beginnt auch, Dateien einfach zu übertragen.

Viele Dinge können passieren und es ist ziemlich einfach, die Konfiguration irgendwann zu vermasseln. Sei besser sicher und halte es außerhalb des Dokumentenstamms.

+0

Sehr guter Punkt. Das ist mehr von dem, was ich gesucht habe. Ich hatte nicht an Softwareupdates und solche Dinge gedacht, die Konfigurationen durcheinander brachten. Vielen Dank! – Travesty3

0
  1. Eine O/S Benutzer für Ihre Anwendung, wie zum Beispiel 'UserForMyApp'

  2. für diesen Benutzer erstellen Sie eine O/S Benutzerumgebungsvariable 'MY_APP_DATABASE_PASSWORD', und setzen Sie den Wert

  3. Führen Sie Ihre App als 'UserForMyApp'

  4. In MyApp, die O/S Benutzerumgebungsvariable lesen 'MY_APP_DATABASE_PASSWORD' und in die Datenbank einloggen verwenden

Andere Benutzer ohne Rootberechtigung können eine O/S-Benutzerumgebungsvariable für einen anderen Benutzer nicht lesen. Dies ist Standard. Im Gegensatz zu w Dateiberechtigungen müssen Sie nichts einstellen.

Es gibt keine Möglichkeit, das Kennwort versehentlich in der Quellcodeverwaltung zu speichern.

Wenn db und app auf demselben Computer sind, kann db nur lokalen Zugriff ohne Passwort vertrauen.