Heim > Artikel > Backend-Entwicklung > Offenlegung des PHP-Sicherheitsquellcodes (2)
Ihr WEB-Server muss in der Lage sein, Ihren Quellcode zu lesen und auszuführen. Das heißt, wenn der von jemandem geschriebene Code vom Server ausgeführt wird, kann er auch Ihren Quellcode lesen. Bei einem Shared Hosting besteht das größte Risiko darin, dass PHP-Code, der von anderen Entwicklern geschrieben wurde, beliebige Dateien lesen kann, da der WEB-Server gemeinsam genutzt wird.
<?php header('Content-Type: text/plain'); readfile($_GET['file']); ?>
Durch die Ausführung des obigen Skripts auf dem Host, auf dem sich Ihr Quellcode befindet, kann ein Angreifer veranlassen, dass der WEB-Server jede Datei liest und anzeigt, indem er den Dateiwert als vollständigen Pfad und Dateinamen angibt. Angenommen, das Skript heißt beispielsweise file.php und befindet sich auf dem Host example.org. Der Inhalt der Datei /path/to/source.php kann durch Zugriff auf den folgenden Link angezeigt werden:
http://www.php.cn/
Damit dieser einfache Code funktioniert, müsste ein Angreifer natürlich genau wissen, wo sich Ihr Quellcode befindet, aber ein Angreifer könnte ein komplexeres Skript schreiben, das es ihm ermöglichen würde, das gesamte Dateisystem zu durchsuchen. Ein Beispiel für diesen Skripttyp finden Sie in den Beispielen weiter unten in diesem Kapitel.
Für dieses Problem gibt es keine perfekte Lösung. Wie in Kapitel 5 erläutert, müssen Sie bedenken, dass Ihr gesamter Quellcode öffentlich ist, auch Code, der außerhalb Ihres Web-Home-Verzeichnisses gespeichert ist.
Der beste Ansatz besteht darin, alle sensiblen Daten in einer Datenbank zu speichern. Dies erhöht zwar die Komplexität beim Schreiben von Code, ist jedoch die beste Möglichkeit, zu verhindern, dass Ihre sensiblen Daten offengelegt werden. Leider gibt es noch ein anderes Problem. Wie speichere ich mein Datenbank-Zugangspasswort?
Bitte schauen Sie sich eine Datei namens db.inc an, die außerhalb des Hauptverzeichnisses der Website gespeichert ist:
<?php $db_user = 'myuser'; $db_pass = 'mypass'; $db_host = 'localhost'; $db = mysql_connect($db_host, $db_user, $db_pass); ?>
Wenn der Pfad zur Datei bekannt (oder erraten) ist, besteht die Möglichkeit, dass ein anderer Benutzer auf Ihrem Server auf die Datei zugreift und Zugriff auf die Datenbank erhält, sodass alle von Ihnen in der Datenbank gespeicherten Daten offengelegt werden.
Die beste Lösung für dieses Problem besteht darin, Ihre Datenbankzugriffsberechtigungen in einer Datei zu speichern, die nur von Systemadministratoren im folgenden Format gelesen werden kann:
SetEnv DB_USER "myuser" SetEnv DB_PASS "mypass"
SetEnv ist ein Apache-Befehl zur Erstellung von zwei Apache-Umgebungsvariablen, die Ihren Datenbank-Benutzernamen bzw. Ihr Passwort darstellen. Der Schlüssel zu diesem Trick liegt natürlich darin, dass nur Systemadministratoren die Datei lesen können. Wenn Sie sich nicht als Systemadministrator anmelden können, können Sie die Datei so beschränken, dass sie nur von Ihnen selbst gelesen werden kann. Dies ist eine ähnliche Schutzmethode wie oben.
$ chmod 600 db.conf $ ls db.conf -rw------- 1 chris chris 48 May 21 12:34 db.conf
Dadurch wird effektiv verhindert, dass bösartige Skripte Zugriff auf Ihre Daten erhalten, sodass kein nennenswertes Risiko für die Sicherheit sensibler Daten in der Datenbank besteht.
Damit diese Datei funktioniert, müssen Sie über PHP auf ihre Daten zugreifen können. Um dieses Ziel zu erreichen, müssen Sie die folgenden Einschlusssätze in httpd.conf schreiben:
Include "/path/to/db.conf"
Es ist zu beachten, dass diese Anweisung in den VirtualHost-Bereich eingefügt werden muss, da sonst andere Benutzer den entsprechenden Inhalt erhalten können.
Da der übergeordnete Prozess von Apache als Systemadministrator ausgeführt wird (muss an Port 80 gebunden werden), kann er die Konfigurationsdatei lesen, aber der untergeordnete Prozess, der Serveranfragen verarbeitet (der PHP-Skripte ausführt), kann die Datei nicht lesen.
Sie können über das superglobale Array $_SERVER auf diese beiden Variablen zugreifen, sodass Sie in db.inc nur auf die Variable $_SERVER verweisen müssen, anstatt die Datenbankberechtigungen anzugeben:
<?php $db_user = $_SERVER['DB_USER']; $db_pass = $_SERVER['DB_PASS']; $db_host = 'localhost'; $db = mysql_connect($db_host, $db_user, $db_pass); ?>
Wenn die Datei offengelegt wird, wird der Datenbankzugriff nicht beeinträchtigt. Dies stellt eine wesentliche Sicherheitsverbesserung für Shared Hosting dar und ist außerdem eine tiefgreifende Verteidigungsmethode für unabhängiges Hosting.
Beachten Sie, dass sich die Datenbankzugriffsrechte bei Verwendung der oben genannten Technik im Super-Public-Array $_SERVER befinden. Dies erfordert auch, dass normale Besucher daran gehindert werden, phpinfo() zum Anzeigen oder aus anderen Gründen auszuführen, die dazu führen, dass der Inhalt von $_SERVER offengelegt wird.
Natürlich können Sie diese Technik verwenden, um alle Informationen zu schützen (nicht nur den Datenbankzugriff), aber ich finde es praktischer, die meisten Daten in einer Datenbank zu speichern, insbesondere da diese Technik die Unterstützung Ihres Hosting-Anbieters erfordert.
Das Obige ist der Inhalt von PHP Security-Source Code Exposure (2). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).