Wenn eine PHP-Anwendung eine Datenbankverbindung herstellt, muss sie im Allgemeinen natürlich ein Login und ein Passwort übergeben. Wenn ich für meine Anwendung ein einziges Login mit Mindestberechtigung verwende, muss das PHP dieses Login und Passwort irgendwo kennen. Was ist der beste Weg, um dieses Passwort zu sichern? Es scheint, als wäre es keine gute Idee, es nur in den PHP-Code zu schreiben.
404
Antworten:
Einige Leute haben dies als Frage zum Speichern von Passwörtern in einer Datenbank falsch verstanden . Das ist falsch. Hier geht es darum, wie Sie das Kennwort speichern, mit dem Sie zur Datenbank gelangen.
Die übliche Lösung besteht darin, das Passwort aus dem Quellcode in eine Konfigurationsdatei zu verschieben. Überlassen Sie dann die Verwaltung und Sicherung dieser Konfigurationsdatei Ihren Systemadministratoren. Auf diese Weise müssen Entwickler nichts über die Produktionskennwörter wissen, und es gibt keine Aufzeichnung des Kennworts in Ihrer Quellcodeverwaltung.
quelle
Wenn Sie auf einem anderen Server hosten und keinen Zugriff außerhalb Ihrer Webroot haben, können Sie Ihr Kennwort und / oder Ihre Datenbankverbindung jederzeit in eine Datei einfügen und die Datei dann mit einem .htaccess sperren:
quelle
Am sichersten ist es, die in Ihrem PHP-Code angegebenen Informationen überhaupt nicht zu haben.
Wenn Sie Apache verwenden, bedeutet dies, dass Sie die Verbindungsdetails in Ihrer httpd.conf- oder virtuellen Hosts-Dateidatei festlegen. Wenn Sie dies tun, können Sie mysql_connect () ohne Parameter aufrufen, was bedeutet, dass PHP Ihre Informationen niemals ausgeben wird.
So geben Sie diese Werte in diesen Dateien an:
Dann öffnen Sie Ihre MySQL-Verbindung wie folgt:
Oder so:
quelle
ini_get()
.but any user (or a hacker abusing badly written php script) can read the password via ini_get()
Wie gehst du damit um?ini_get()
oder verwendengetenv()
.Speichern Sie sie in einer Datei außerhalb des Webstamms.
quelle
include('../otherDirectory/configfile.conf')
?Für extrem sichere Systeme verschlüsseln wir das Datenbankkennwort in einer Konfigurationsdatei (die selbst vom Systemadministrator gesichert wird). Beim Start der Anwendung / des Servers fordert die Anwendung den Systemadministrator zur Eingabe des Entschlüsselungsschlüssels auf. Das Datenbankkennwort wird dann aus der Konfigurationsdatei gelesen, entschlüsselt und zur zukünftigen Verwendung im Speicher gespeichert. Immer noch nicht 100% sicher, da es entschlüsselt im Speicher gespeichert ist, aber Sie müssen es irgendwann als "sicher genug" bezeichnen!
quelle
Diese Lösung ist insofern allgemein, als sie sowohl für Open- als auch für Closed-Source-Anwendungen nützlich ist.
Vorteile:
Diese Methode wird von Heroku vorgeschlagen, die sehr erfolgreich sind.
quelle
Wenn es möglich ist, die Datenbankverbindung in derselben Datei zu erstellen, in der die Anmeldeinformationen gespeichert sind. Fügen Sie die Anmeldeinformationen in die connect-Anweisung ein.
Andernfalls ist es am besten, die Anmeldeinformationen nach der connect-Anweisung zu deaktivieren, da Anmeldeinformationen, die sich nicht im Speicher befinden, nicht aus dem Speicher gelesen werden können ;)
quelle
Ihre Auswahlmöglichkeiten sind begrenzt, da Sie das Kennwort für den Zugriff auf die Datenbank benötigen. Ein allgemeiner Ansatz besteht darin, den Benutzernamen und das Kennwort in einer separaten Konfigurationsdatei und nicht im Hauptskript zu speichern. Stellen Sie dann sicher, dass Sie das außerhalb des Hauptwebbaums speichern. Wenn es ein Problem mit der Webkonfiguration gibt, bei dem Ihre PHP-Dateien einfach als Text angezeigt und nicht ausgeführt werden, haben Sie das Kennwort nicht offengelegt.
Ansonsten sind Sie mit minimalem Zugriff auf das verwendete Konto in der richtigen Linie. Dazu noch etwas
Peter
quelle
Wenn Sie PostgreSQL verwenden, sucht es
~/.pgpass
automatisch nach Passwörtern. Weitere Informationen finden Sie im Handbuch .quelle
Zuvor haben wir DB-Benutzer / Pass in einer Konfigurationsdatei gespeichert, sind jedoch seitdem in den paranoiden Modus übergegangen - und haben eine Richtlinie zur Tiefenverteidigung übernommen .
Wenn Ihre Anwendung gefährdet ist, hat der Benutzer Lesezugriff auf Ihre Konfigurationsdatei, sodass ein Cracker diese Informationen möglicherweise lesen kann. Konfigurationsdateien können auch von der Versionskontrolle erfasst oder auf Servern kopiert werden.
Wir haben auf das Speichern von Benutzer- / Pass-Umgebungsvariablen umgestellt, die im Apache VirtualHost festgelegt wurden. Diese Konfiguration kann nur von root gelesen werden - hoffentlich wird Ihr Apache-Benutzer nicht als root ausgeführt.
Der Nachteil dabei ist, dass sich das Passwort jetzt in einer globalen PHP-Variablen befindet.
Um dieses Risiko zu minimieren, haben wir die folgenden Vorsichtsmaßnahmen:
phpinfo()
ist behindert. PHPInfo ist ein einfaches Ziel, um einen Überblick über alles zu erhalten, einschließlich Umgebungsvariablen.quelle
Fügen Sie das Datenbankkennwort in eine Datei ein und machen Sie es für den Benutzer, der die Dateien bereitstellt, schreibgeschützt.
Dies ist so ziemlich alles, was Sie tun können, es sei denn, Sie haben nur die Möglichkeit, dem PHP-Serverprozess den Zugriff auf die Datenbank zu ermöglichen.
quelle
Wenn Sie über das Datenbankkennwort sprechen, im Gegensatz zu dem Kennwort, das von einem Browser stammt, scheint die Standardpraxis darin zu bestehen, das Datenbankkennwort in einer PHP-Konfigurationsdatei auf dem Server abzulegen.
Sie müssen nur sicherstellen, dass die PHP-Datei, die das Passwort enthält, über die entsprechenden Berechtigungen verfügt. Dh es sollte nur vom Webserver und von Ihrem Benutzerkonto lesbar sein.
quelle
Nur irgendwo in eine Konfigurationsdatei zu legen, ist die übliche Vorgehensweise. Stellen Sie einfach sicher, dass Sie:
quelle
Wir haben es folgendermaßen gelöst:
quelle
Ein zusätzlicher Trick besteht darin, eine separate PHP-Konfigurationsdatei zu verwenden, die folgendermaßen aussieht:
Dies hindert Sie nicht daran, die Zugriffsregeln richtig festzulegen. Wenn Ihre Website jedoch gehackt wird, wird das Skript in der ersten Zeile durch ein "Erfordernis" oder ein "Einschließen" beendet, sodass es noch schwieriger ist, die Daten abzurufen.
Lassen Sie jedoch niemals Konfigurationsdateien in einem Verzeichnis zu, auf das über das Web zugegriffen werden kann. Sie sollten einen "Web" -Ordner haben, der Ihren Steuerungscode, CSS, Bilder und JS enthält. Das ist alles. Alles andere wird in Offline-Ordnern abgelegt.
quelle
require
/include
aber wie zu verhindernfopen
?Der beste Weg ist, das Passwort überhaupt nicht zu speichern!
Wenn Sie sich beispielsweise auf einem Windows-System befinden und eine Verbindung zu SQL Server herstellen, können Sie mithilfe der integrierten Authentifizierung eine Verbindung zur Datenbank ohne Kennwort unter Verwendung der Identität des aktuellen Prozesses herstellen.
Wenn Sie eine Verbindung mit einem Kennwort herstellen müssen, verschlüsseln Sie es zuerst mit einer starken Verschlüsselung (z. B. mit AES-256 und schützen Sie dann den Verschlüsselungsschlüssel oder verwenden Sie eine asymmetrische Verschlüsselung, und lassen Sie das Betriebssystem das Zertifikat schützen) und speichern Sie es dann in einem Konfigurationsdatei (außerhalb des Webverzeichnisses) mit starken ACLs .
quelle