web-dev-qa-db-fra.com

Comment se connecter en toute sécurité à une base de données avec PHP?

Actuellement en PHP (dans le fichier /var/www/website.com/public_html/functions.php). Je me connecte à la base de données comme ceci:

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;
}

Où le /var/www/website.com/db.ini est

username=user123
password=pass123
db=mydb

avec des autorisations:

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

Le PHP sera exécuté par www-data ou root.

La racine de website.com est /var/www/website.com/public_html/.

Est-ce la meilleure façon de se connecter à une base de données en utilisant PHP d'un point de vue de la sécurité? Je crée également ce code open source.

7
maxisme

Votre approche semble bonne.

  • Vous stockez les informations d'identification dans un fichier de configuration distinct au lieu de les avoir écrites en ligne dans le code source. Cela le rend sûr lors du partage du code avec d'autres et protège les informations d'identification dans le cas où une mauvaise configuration permet d'imprimer le code PHP code ordinaire (ce qui arrive assez souvent).

  • Le fichier de configuration est en dehors de la racine du document public, il ne peut donc pas être directement accessible par un utilisateur de l'application Web, sauf s'il existe une autre vulnérabilité (par exemple, une faille de traversée de répertoire).

  • Dans tous les cas, vous devez éviter d'exécuter le serveur en tant que root. Sinon, le modèle d'autorisation est sans valeur, car root peut lire et écrire dans n'importe quel fichier.

Notez que vous n'avez pas du tout à gérer l'analyse des informations d'identification dans votre code - vous pouvez plutôt les spécifier comme paramètres d'exécution PHP dans la configuration du serveur, comme expliqué ici .

Regarde aussi:

6
Arminius

Je suis sceptique quant à cette approche -rw-r--r-- 1 root root. Le moyen sûr de le faire serait

  1. Rendez le fichier -r-------- 1 root root C'est-à-dire lisible uniquement par l'utilisateur root
  2. Démarrez votre application en tant que root, lisez les informations d'identification et connectez-vous puis immédiatement setuid() à www-data. Ainsi, toute personne qui compromet l'application ne peut pas lire le fichier, même via une attaque de traversée de répertoire, à moins bien sûr de trouver un autre moyen d'obtenir root dans ce cas, le jeu est terminé de toute façon. Ceci devrait être possible en PHP .

Il s'agit du même mécanisme que les serveurs Web utilisent pour se lier au port 80, qui est un port privilégié.

0
Gaius