414 votes

Comment sécuriser les mots de passe des bases de données en PHP ?

Lorsqu'une application PHP se connecte à une base de données, elle doit bien sûr fournir un identifiant et un mot de passe. Si j'utilise un login unique, à autorisation minimale, pour mon application, alors PHP doit connaître ce login et ce mot de passe quelque part. Quelle est la meilleure façon de sécuriser ce mot de passe ? Il semble que l'écrire simplement dans le code PHP ne soit pas une bonne idée.

1 votes

Pour une sécurité totale, vous devez mettre en place une connexion SSL, sinon n'importe qui sur votre réseau peut toujours renifler le mot de passe que vous tapez.

1 votes

Voulez-vous dire les mots de passe des utilisateurs ou le mot de passe de la base de données utilisé dans la chaîne de connexion ?

4 votes

Mot de passe de la base de données utilisé dans la chaîne de connexion. Merci !

252voto

user11318 Points 4804

Plusieurs personnes ont mal interprété cette question comme étant une question sur la façon de magasin mots de passe dans une base de données. C'est faux. Il s'agit de savoir comment stocker le mot de passe qui vous permet d'obtenir a la base de données.

La solution habituelle consiste à déplacer le mot de passe du code source vers un fichier de configuration. Laissez ensuite l'administration et la sécurisation de ce fichier de configuration à vos administrateurs système. De cette façon, les développeurs n'ont pas besoin de savoir quoi que ce soit sur les mots de passe de production, et il n'y a aucune trace du mot de passe dans votre contrôle de source.

9 votes

Merci. Si je comprends bien, le fichier php aura alors un include vers le fichier de configuration, lui permettant d'utiliser le mot de passe. Par exemple, je crée un fichier appelé 'app1_db_cfg.php' qui stocke le login, le mot de passe et le nom de la base de données. Ensuite, ma page application.php inclut 'app1_db_cfg.php' et c'est parti !

0 votes

Oui, je fais habituellement DEFINE("DB_NAME", "mydb") ; etc. C'est également pratique pour définir tout ce que vous utiliserez sur plus d'une page, et que vous voudrez peut-être changer plus tard.

0 votes

Le simple fait de sauvegarder le mot de passe dans un fichier de configuration n'est pas beaucoup plus sûr. Il doit être correctement protégé, en utilisant des ACLs forts et un cryptage fort avec des clés correctement protégées... Voir mon post ci-dessous.

106voto

kellen Points 1251

Si vous hébergez sur le serveur de quelqu'un d'autre et que vous n'avez pas d'accès en dehors de votre webroot, vous pouvez toujours mettre votre mot de passe et/ou votre connexion à la base de données dans un fichier, puis verrouiller ce fichier à l'aide d'un .htaccess :

<files mypasswdfile>
order allow,deny
deny from all
</files>

3 votes

Merci, c'est exactement ce que je cherchais.

0 votes

Utile, si c'est vraiment sécurisé, bien qu'il semble qu'un login shell y aurait toujours accès.

29 votes

Sans aucun doute, mais si quelqu'un a un accès shell, votre compte entier a été compromis de toute façon.

50voto

Lars Nyström Points 974

Le moyen le plus sûr est de ne pas spécifier du tout les informations dans votre code PHP.

Si vous utilisez Apache, cela signifie que vous devez définir les détails de la connexion dans votre fichier httpd.conf ou votre fichier virtual hosts. Si vous faites cela, vous pouvez appeler mysql_connect() sans paramètres, ce qui signifie que PHP n'affichera jamais vos informations.

C'est ainsi que vous spécifiez ces valeurs dans ces fichiers :

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server

Puis vous ouvrez votre connexion mysql comme ceci :

<?php
$db = mysqli_connect();

Ou comme ça :

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.host"));

1 votes

Veuillez vérifier les valeurs appropriées de ini_get('default values') php.net/manual/fr/class.mysqli.php

0 votes

Peut-on l'utiliser dans son fichier .htaccess ?

5 votes

Oui, mais n'importe quel utilisateur (ou un pirate abusant d'un script php script) peut lire le mot de passe via ini_get() .

42voto

da5id Points 4651

Stockez-les dans un fichier en dehors de web Root.

31 votes

Et aussi, comme mentionné ailleurs, en dehors du contrôle de la source.

6 votes

Nous pourrions l'inclure ? Par exemple, en PHP, pouvons-nous alors faire include('../otherDirectory/configfile.conf') ?

1 votes

Vous suggérez tous de stocker les informations d'identification en dehors du wwwroot. Ok, je comprends le contexte de sécurité. Mais comment doivent-ils être stockés dans le contrôle de version alors (exemple de configuration) ? Habituellement, wwwroot est la racine du repo git, donc s'il y a quelque chose à l'extérieur, ce sera à l'extérieur du VC. Imaginez qu'un nouveau développeur essaie de mettre en place une instance locale pour le développement - comment devrait-il connaître la magie du genre "prenez ce fichier, copiez-le à l'extérieur et remplissez-le" ?

37voto

pdavis Points 2497

Pour les systèmes extrêmement sécurisés, nous chiffrons le mot de passe de la base de données dans un fichier de configuration (qui est lui-même sécurisé par l'administrateur système). Au démarrage de l'application/serveur, l'application demande alors à l'administrateur système la clé de décryptage. Le mot de passe de la base de données est alors lu dans le fichier de configuration, décrypté et stocké en mémoire pour une utilisation ultérieure. Ce n'est pas encore 100% sécurisé puisqu'il est stocké en mémoire après décryptage, mais il faut bien dire que c'est "suffisamment sécurisé" à un moment donné !

39 votes

@RaduMurzea c'est ridicule. Quand avez-vous entendu parler de Sys Admins mourir ? Ils sont comme McDonalds, ils apparaissent / disparaissent de nulle part !

14 votes

@Radu Murzea Il suffit d'avoir 2 admins ou plus, alors vous avez la parité comme un raid array. Les chances que plus d'un disque tombe en panne à la fois sont beaucoup plus faibles.

5 votes

Qu'en est-il lorsque les serveurs redémarrent ? Qu'en est-il du temps qu'il faut pour réveiller l'administrateur et lui faire taper le mot de passe etc.etc. lol

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X