Offenlegung von DB-Zugangsdaten

Viele PHP basierte Anwendungen arbeiten mit einer Datenbank zusammen. Logischerweise beinhaltet dies dann auch, dass zu der Datenbank - unter Zuhilfenahme von Zugangsdaten - eine Verbindung hergestellt werden muss.

Zitat<?php
$host = 'example.tld';
$username = 'myuser';
$password = 'mypass';
$db = mysql_connect($host, $username, $password);
?>

Obiges Beispiel könnte eine Datei db.inc sein, die überall dort eingebunden wird, wo eine Verbindung zur Datenbank nötig ist. Dieses Verfahren ist sehr bequem und alle empfindlichen Daten werden an einem Ort zentral gesammelt.

Mögliche Probleme treten auf, wenn diese Datei so abgelegt wird, dass sie von außen erreichbar ist, etwa im Document-Root. Dies ist naheliegend, da es die Einbindung via include() erheblich erleichtert – doch kann es zu Situationen führen, in denen die sensiblen Daten offen gelegt werden. Man muss daran denken, dass jede Datei im Document-Root eine zugeordnete Adresse hat. Wenn etwa unter /usr/local/apache/htdocs das Document-Root liegt, würde die Datei db.inc unter /usr/local/apache/htdocs/inc/db.inc liegen und somit über http://example.tld/inc/db.inc. erreichbar sein.
Dies, in Kombination mit der Tatsache, dass die meisten Server eine .inc Datei als Klartext zum Browser senden, sollte klar machen wie gefährlich solch unüberlegte Handlungen sein können.

Ein Schritt kann sicherlich sein, alle auf diese Art eingebundenen Dateien ausserhalb des Document-Root zu platzieren. Schliesslich kann der Include-Pfad auch auf Verzeichnisse zeigen, die nicht von außen erreichbar sind.

Der im Originalskript folgende Abschnitt wurde hier nicht aufgenommen, da die dortigen Tipps nicht unbedingt der Sicherheit förderlich sind. Wer DB-Daten ausgliedern will, sollte schlichtweg eine db.php anlegen, die Zugangsdaten in Konstanten definieren und das ganze ausserhalb der Webroot oder zuminestens in einem Unterverzeichnis ablegen, das eine .htaccess mit der Zeile "deny from all" beinhaltet.

Die im Skript vorgeschlagene Methode, über SetEnv die DB Daten in der Apache-Umgebung zu hinterlegen ist dagegen gemeinhin unsicher: ein einfaches phpinfo() genügt und schon sieht jeder die Zugangsdaten – zu oft enthält Software die man nutzt irgendwo ein phpinfo() als dass man dieses Risiko eingehen dürfte.

Darüber hinaus der obligatorische Hinweis, dass man seinen mySQL Server niemals für die Aussenwelt öffnen sollte. Zugriffe sollten nur über Localhost möglich sein.


Netzwerke