it-swarm.com.de

PHP und MySQL - Wie vermeide ich ein Passwort im Quellcode?

Ich habe eine kleine PHP) - Anwendung, die Daten in einer MySQL - Datenbank speichert. Derzeit sind Benutzername und Passwort im PHP) - Code fest codiert Eine Situation, die ich zum Beispiel nicht wirklich mag, da der Code auch in einem Repository verfügbar ist.

Die beste Idee, die ich habe, ist, die Daten aus dem Code in eine Konfigurationsdatei zu verschieben (aus dem Repository ausgeschlossen) und sie irgendwie zu codieren, damit sie nicht direkt lesbar sind (Verschleierung). Gibt es eine bessere und einfach zu verwendende Möglichkeit, das Problem zu lösen?

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) { 
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

Anwendungsbereich: Ich möchte eine robuste, aber auch benutzerfreundliche Lösung etablieren. Ich möchte angemessene Sicherheit, habe aber hier nicht mit streng vertraulichen Daten zu tun.

Anmerkung: Es wird nicht mehr empfohlen, die Funktionen mysql_connect Zu verwenden, siehe Frage zum Stapelüberlauf Warum sollte ich nicht mysql _ verwenden? funktioniert in PHP? *. Ich hätte das Codebeispiel ändern können, aber da sich einige Kommentare darauf beziehen, habe ich es nicht getan. Der ursprüngliche Charakter der Frage bleibt jedoch gültig.

111
Horst Walter

Der einfachste Weg ist, wie Sie sagten, eine Konfigurationsdatei zu verwenden.

Viele Frameworks verwenden dies ( Zend , CakePHP , Kohana , usw.) und es ist die gebräuchlichste Methode, um Dinge zu erledigen (auch in einem Nicht-PHP Umgebung wie ASP.NET mit seinem web.config Dateien). Auf diese Weise können Sie auch Konfigurationswerte von Umgebung zu Umgebung kopieren, indem Sie nur die Dateien für die Site kopieren. Dies ist ein Vorteil gegenüber der Verwendung von Umgebungsvariablen für die Serverkonfiguration (die schnell verloren gehen und vergessen werden können).

Sie sollten sich keine Gedanken über die Verschleierung des Passworts machen müssen, da es sich nicht um eine Datei handelt, auf die weltweit zugegriffen werden kann. Sie sollte auf keinen Fall über das Internet zugänglich sein. Was ich damit meine ist, dass Sie entweder a) Ihren Webserver anweisen, Ihre Konfigurationsdatei nicht bereitzustellen ( IIS tut dies bereits mit web.config Dateien und stellt einen HTTP 404.8-Status anstelle des Inhalts bereit. Wenn jemand Ihre Konfigurationsdatei sehen kann, ist es schlimmer, als sie in Ihrem Quellcode zu haben.

Es wird auch eine gute Idee sein, eine Basisversion (leer/Standard) der Konfigurationsdatei zu haben und diese nach Umgebungen zu trennen, damit Sie eine andere Konfigurationsdatei für Produktions-, Entwicklungs- und Testplattformen haben können.

Eine Umgebungsvariable ist die gebräuchlichste Methode zur Unterscheidung zwischen diesen Umgebungen, etwa der folgende Code:

// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
    // Copy from web server to PHP constant
    define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}

if (!defined('ENVIRONMENT')) {
    // Default to development
    define('ENVIRONMENT', 'development');
}

// Load in default configuration values
require_once 'config.default.php';

// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';

Eine andere Möglichkeit ist die Verwendung einer XML-Konfigurationsdatei und das Einlesen der erforderlichen Werte (Speichern einer zwischengespeicherten Kopie der Konfigurationsdatei im Speicher). Dies kann sehr leicht darauf beschränkt werden, nur bestimmte Werte zu laden, anstatt das willkürliche Einfügen von PHP Dateien zuzulassen, und ist meiner Meinung nach insgesamt eine bessere Lösung, aber das Obige sollte Sie in die richtige Richtung leiten Richtung.

Sie möchten wahrscheinlich, dass Ihr VCS die Datei ignoriert. Auf der anderen Seite möchten Sie möglicherweise ein Skelett der Datei oder eines mit angemessenen Standardeinstellungen (letzteres gilt natürlich nicht für Anmeldedaten), das versionskontrolliert werden soll. Eine gebräuchliche Vorgehensweise besteht darin, eine Konfigurationsdatei für die eingecheckte Vorlage zu haben, und die Installationsprozedur kopiert diese Datei an den Speicherort der eigentlichen Konfigurationsdatei, wo sie angepasst wird. Dies kann ein manueller oder ein automatisierter Prozess sein.

(Die Einführung einer Konstante für Ihre Umgebung hat zwar nichts mit der Hauptfrage zu tun, aber Sie können andere coole Dinge tun, z. B. die Zurückstellung auf eine gefälschte E-Mail-Implementierung anstelle einer Live-Implementierung SMTP eins, aber das könnte natürlich auch mit einer Konfigurationsdatei gemacht werden)

68
Rudi Visser

Eine ziemlich nette Lösung, wenn Sie auf Apache sind, ist es, die Informationen in der virtualhost-Konfiguration zu speichern

SetEnv  MYSQL_USER     "xx"
SetEnv  MYSQL_PASSWORD "y2wrg435yw8"

Die Daten können einfach mit $_ENV[] zur Verwendung im Code.

46
hank

Wie andere bereits erwähnt haben, speichern Sie es in einer separaten Konfigurationsdatei außerhalb der Quellcodeverwaltung (dies wird natürlich in Code erwähnt, der sich in der Quellcodeverwaltung befindet).

Es ist auch eine gute Idee, die Datei config.php anstelle von config.ini zu benennen, falls das Verzeichnis versehentlich freigelegt wird, was bedeutet, dass die Datei nicht heruntergeladen wird , sondern es gibt nichts zurück.

11
acutesoftware

Wenn Sie der Meinung sind, dass der Weg 12factor wertvoll ist, empfehlen sie, config in der Umgebung zu speichern.

Dies hat den zusätzlichen Vorteil, dass Sie genau denselben Code schreiben können , wenn Sie testen oder auf andere Weise in einer Nichtproduktionsumgebung arbeiten. Wenn Sie die Datenbank oder etwas anderes ändern möchten (oder müssen), müssen Sie Ihren Code nicht ändern. Sie müssen nur die Umgebungsvariablen ändern und können loslegen.

5
Wayne Werner

Was ich tun würde, ist, nur die Beispielkonfigurationsdatei wie config.php.dist im Repository zu speichern und die aktuelle config.php nicht der Versionskontrolle zu unterstellen.

2
Serge Kuharev

Es ist ratsam, das Kennwort vom Code in eine Konfigurationsdatei zu verschieben, damit es nicht im Repository gespeichert wird. Die Idee, es in einer Konfigurationsdatei zu verschlüsseln, ist fraglich, da derjenige, der über die Konfigurationsdatei + PHP) verfügt, die es entschlüsselt, den Code immer ausführen und ein Klartext-Passwort erhalten kann Es ist besser, das Kennwort in einer Konfigurationsdatei als Klartext zu speichern und zu überlegen, wie die Konfigurationsdatei vor unbefugtem Zugriff geschützt werden kann.

2

Gute Frage. Sie könnten die vertraulichsten Elemente (z. B. Schlüssel/Kennwörter) als Umgebungsvariablen verschieben, aber dies würde das Problem nur auf Ihre Serverkonfiguration verschieben (die sich vermutlich auch in einem Repository befindet).

Sie können auch versuchen, Passwörter für Dinge wie die Datenbank zu vermeiden, indem Sie das Passwort verringern und es stattdessen hinter einer Firewall sichern. Keine dieser Lösungen ist perfekt, aber sie sind die Ansätze, die ich kenne.

2
troelskn

Ich sehe das ganze Problem hier nicht. Wenn Sie ein Repository gemeinsam nutzen, möchten Sie wahrscheinlich keine Kennwörter und Konfigurationen fest codieren. Sie sollten stattdessen einen Standardwert angeben:

Host: localhost
user: root
pass: root
name: db

Wenn Sie wirklich wollen, können Sie ein .ini Datei, aber es ist wahrscheinlich sehr langsam im Vergleich zu einem Array, das im Quellcode gesetzt ist und macht für mich nicht wirklich viel Sinn.

Denken Sie daran: Das Einzige, dem Sie vertrauen können, ist Ihr Quellcode. Wenn sie ihn bekommen können, sind Sie sowieso durcheinander.

1
Shoe

Sie können jederzeit eine Konfigurationsdatei mit der Funktion parse_ini_file erstellen.

1
Dawid Sajdak