it-swarm.com.de

Wie kann ich mit PHP eine sichere Verbindung zu einer Datenbank herstellen?

Derzeit in PHP (in der Datei /var/www/website.com/public_html/functions.php). Ich verbinde mich wie folgt mit der Datenbank:

function connect(){
    $config = parse_ini_file('/var/www/website.com/db.ini');
    $con = mysqli_connect("localhost",$config['username'],$config['password'],$config['db']);
    if(!$con){
        die("Failed to connect to Database"); 
    }
    return $con;
}

Wo der /var/www/website.com/db.ini Ist

username=user123
password=pass123
db=mydb

mit Berechtigungen:

-rw-r--r-- 1 root root 84 /var/www/website.com/db.ini

Das PHP wird entweder von www-data Oder root ausgeführt.

Die Wurzel von website.com Ist /var/www/website.com/public_html/.

Ist dies der beste Weg, um mit PHP aus Sicherheitsgründen eine Verbindung zu einer Datenbank herzustellen? Ich mache diesen Code auch Open Source.

7
maxisme

Ihr Ansatz sieht gut aus.

  • Sie speichern die Anmeldeinformationen in einer separaten Konfigurationsdatei, anstatt sie in den Quellcode einfügen zu lassen. Dies macht es sicher, wenn der Code mit anderen geteilt wird, und schützt die Anmeldeinformationen, falls durch eine Fehlkonfiguration der einfache Code PHP) ausgedruckt werden kann (was ziemlich häufig vorkommt).

  • Die Konfigurationsdatei befindet sich außerhalb des Stammverzeichnisses für öffentliche Dokumente und kann daher von einem Benutzer der Webanwendung nicht direkt aufgerufen werden, es sei denn, es liegt eine andere Sicherheitsanfälligkeit vor (z. B. ein Fehler beim Durchlaufen des Verzeichnisses).

  • In jedem Fall sollten Sie vermeiden, den Server als root auszuführen. Andernfalls ist das Berechtigungsmodell wertlos, da root jede Datei lesen und schreiben kann.

Beachten Sie, dass Sie sich überhaupt nicht mit dem Parsen der Anmeldeinformationen in Ihrem Code befassen müssen. Sie können sie stattdessen in der Serverkonfiguration als PHP-Laufzeiteinstellungen angeben, wie erläutert hier .

Siehe auch:

6
Arminius

Ich bin skeptisch gegenüber diesem -rw-r--r-- 1 root root Ansatz. Der sichere Weg wäre es

  1. Machen Sie die Datei -r-------- 1 root root, D. H. Nur für Benutzer root lesbar.
  2. Starten Sie Ihre App als root, lesen Sie die Anmeldeinformationen und verbinden Sie sich dann sofort setuid() mit www-data. Jeder, der die App kompromittiert , kann die Datei nicht lesen, auch nicht über einen Verzeichnisdurchlaufangriff, es sei denn, er findet natürlich ein anderes Mittel, um root zu erhalten In diesem Fall ist das Spiel sowieso vorbei. Dies sollte in PHP möglich sein .

Dies ist der gleiche Mechanismus, den Webserver zum Binden an Port 80 verwenden, der ein privilegierter Port ist.

0
Gaius