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

quand une application PHP fait une connexion de base de données, elle a bien sûr généralement besoin de passer un login et un mot de passe. Si j'utilise une seule connexion de permission minimale pour mon application, alors le PHP doit connaître cette connexion et ce mot de passe quelque part. Quelle est la meilleure façon de sécuriser ce mot de passe? Il semble que simplement l'écrire dans le code PHP n'est pas une bonne idée.

359
demandé sur AviD 2008-09-19 03:27:03

17 réponses

plusieurs personnes ont mal interprété cette question sur la façon de stocker mots de passe dans une base de données. Ce qui est mauvais. C'est sur la façon de stocker le mot de passe qui vous permet d'obtenir à la base de données.

la solution habituelle est de déplacer le mot de passe hors du code source dans un fichier de configuration. Ensuite, laissez l'administration et la sécurisation du fichier de configuration aux administrateurs de votre système. Ainsi les développeurs n'ont pas besoin de savoir rien sur les mots de passe de production, et il n'y a pas d'enregistrement du mot de passe dans votre contrôle source.

209
répondu user11318 2011-11-07 19:51:47

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 une connexion de base de données dans un fichier et ensuite verrouiller le fichier en utilisant un .htaccess:

<files mypasswdfile>
order allow,deny
deny from all
</files>
94
répondu kellen 2009-08-03 18:28:18

les stocker dans un fichier en dehors de la racine web.

36
répondu da5id 2008-09-18 23:32:18

le moyen le plus sûr est de ne pas avoir les informations spécifiées dans votre code PHP.

si vous utilisez Apache, cela signifie définir les détails de la connexion dans votre httpd.fichier conf ou hôte virtuel. Si vous faites cela, vous pouvez appeler mysql_connect() sans Paramètres, ce qui signifie que PHP ne sortira jamais vos informations.

voici comment 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 ceci:

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.host"));
36
répondu Lars Nyström 2013-11-21 14:42:21

pour les systèmes extrêmement sûrs, 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 du système). Au démarrage de l'application / du serveur, l'application demande alors à l'administrateur système la clé de déchiffrement. Le mot de passe de la base de données est alors lu à partir du fichier de configuration, déchiffré et stocké en mémoire pour une utilisation future. Toujours pas 100% sécurisé puisqu'il est stocké en mémoire déchiffré, mais vous devez l'appeler "assez sécurisé" à un moment donné!

33
répondu pdavis 2008-09-19 13:33:51

cette solution est générale, en ce qu'elle est utile pour les applications à source ouverte et fermée.

  1. créez un utilisateur OS pour votre application. Voir http://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. créer une variable d'environnement OS (non-session) pour cet utilisateur ,avec le mot de passe
  3. exécuter l'application comme cet utilisateur

avantages:

  1. vous ne vérifierez pas vos mots de passe dans le contrôle source par accident, parce que vous ne pouvez pas
  2. vous ne gâcherez pas accidentellement les permissions de fichiers. Eh bien, vous pourriez, mais cela n'affectera pas cette.
  3. ne Peut être lu que par root ou utilisateur. Root peut lire tous vos fichiers et clés de cryptage de toute façon.
  4. si vous utilisez le cryptage, comment stockez-vous la clé en toute sécurité?
  5. "151930920 Œuvres" x-plate-forme
  6. assurez-vous de ne pas passer l'envvar à des processus enfants non fiables

cette méthode est suggérée par Heroku, qui sont très réussis.

13
répondu Neil McGuigan 2016-04-26 16:20:46

s'il est possible de créer la connexion à la base de données dans le même fichier où les justificatifs d'identité sont stockés. Inline les justificatifs d'identité dans la déclaration connect.

mysql_connect("localhost", "me", "mypass");

sinon, il est préférable de désactiver les justificatifs d'identité après la déclaration connect, parce que les justificatifs d'identité qui ne sont pas en mémoire, ne peuvent pas être lire de mémoire ;)

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  
11
répondu Bob Fanger 2017-05-19 05:49:50

vos choix sont en quelque sorte limités car vous dites que vous avez besoin du mot de passe pour accéder à la base de données. Une approche générale consiste à stocker le nom d'utilisateur et le mot de passe dans un fichier de configuration distinct plutôt que dans le script principal. Alors assurez-vous de stocker cela en dehors de l'arbre principal de web. C'est que s'il y a un problème de configuration web qui laisse vos fichiers php simplement affichés sous forme de texte plutôt que d'être exécutés, vous n'avez pas exposé le mot de passe.

Autre que celui que vous sont sur les bonnes lignes avec un accès minimal pour le compte utilisé. Ajouter à cela

  • de Ne pas utiliser la combinaison de nom d'utilisateur/mot de passe pour autre chose
  • configurer le serveur de base de données pour n'accepter que les connexions de l'hôte web pour cet utilisateur (localhost est encore mieux si la base de données est sur la même machine) de cette façon, même si les justificatifs d'identité sont exposés, ils ne sont d'aucune utilité pour quiconque à moins qu'ils n'aient un autre accès à la machine.
  • obscurcit le mot de passe (même ROT13 le fera) il ne mettra pas beaucoup de défense si certains obtiennent l'accès au fichier, mais au moins il empêchera la visualisation occasionnelle de celui-ci.

Peter

7
répondu Vagnerr 2008-09-18 23:36:03

je pense que L'OP signifie le mot de passe de la base de données.

à moins que quelqu'un n'accède à votre serveur par FTP ou SSH (auquel cas vous êtes déjà fichu), Je ne m'inquiéterais pas de stocker les mots de passe en clair dans des fichiers PHP. La plupart des applications PHP que j'ai vu le font de cette façon, par exemple phpbb.

5
répondu Ryan Bigg 2008-09-18 23:31:52

mettez le mot de passe de la base de données dans un fichier, faites-le lire-seulement à l'utilisateur desservant les fichiers.

à moins que vous n'ayez un moyen de n'autoriser le processus du serveur php qu'à accéder à la base de données, c'est à peu près tout ce que vous pouvez faire.

5
répondu Chris 2008-09-18 23:32:40

si vous utilisez PostgreSQL, alors il regarde dans ~/.pgpass pour les mots de passe automatiquement. Voir le manuel pour plus d'informations.

5
répondu Jim 2008-09-18 23:52:43

si vous parlez du mot de passe de la base de données, par opposition au mot de passe provenant d'un navigateur, la pratique standard semble être de mettre le mot de passe de la base de données dans un fichier de configuration PHP sur le serveur.

Vous avez juste besoin d'être sûr que le fichier php contenant le mot de passe des autorisations appropriées. I. e. il doit être lisible uniquement par le serveur web et par votre compte d'utilisateur.

4
répondu Jason Wadsworth 2008-09-18 23:35:09

auparavant, nous avions stocké l'utilisateur/pass DB dans un fichier de configuration, mais nous avons depuis atteint le mode paranoid -- adoptant une politique de Défense en profondeur .

si votre application est compromise, l'utilisateur aura accès en lecture à votre fichier de configuration et il est donc possible qu'un pirate Lise cette information. Les fichiers de Configuration peuvent également être bloqués dans le contrôle de version, ou copiés autour des serveurs.

Nous sommes passés à stockage des variables user/pass dans L'environnement défini dans le VirtualHost D'Apache. Cette configuration n'est lisible que par root -- espérons que votre utilisateur Apache ne s'exécute pas en tant que root.

le con avec ceci est que maintenant le mot de passe est dans une variable PHP globale.

Pour atténuer ce risque, nous avons les précautions suivantes:

  • le mot de passe est crypté. nous étendons la classe AOP pour inclure la logique pour le décryptage du mot de passe. Si quelqu'un lit le code où nous établissons une connexion, il ne sera pas évident que la connexion est établie avec un mot de passe crypté et pas le mot de passe lui-même.
  • le mot de passe crypté est déplacé des variables globales vers une variable privée l'application fait cela immédiatement pour réduire la fenêtre que la valeur est disponible dans l'espace global.
  • phpinfo() est désactivé. PHPInfo est une cible facile pour obtenir un aperçu de tout, y compris les variables d'environnement.
4
répondu Courtney Miles 2017-02-15 02:41:48

une astuce supplémentaire est d'utiliser un fichier de configuration séparé de PHP qui ressemble à cela :

<?php exit() ?>

[...]

Plain text data including password

cela ne vous empêche pas de définir correctement les règles d'accès. Mais dans le cas où votre site web est piraté, un "require" ou un "include" sortira juste du script à la première ligne donc il est encore plus difficile d'obtenir les données.

néanmoins, ne laissez jamais les fichiers de configuration dans un répertoire accessible sur le web. Vous devriez avoir un dossier" Web " contenant votre code de controler, css, photos et js. C'est tout. Tout le reste va dans des dossiers hors ligne.

3
répondu e-satis 2008-09-19 13:08:18

la meilleure façon est de ne pas stocker le mot de passe du tout!

Par exemple, si vous êtes sur un système Windows, et que vous vous connectez à SQL Server, vous pouvez utiliser L'authentification intégrée pour vous connecter à la base de données sans mot de passe, en utilisant l'identité du processus en cours.

si vous devez vous connecter avec un mot de passe, d'abord chiffrez il, en utilisant un cryptage fort (par exemple en utilisant AES-256, puis de protéger la clé de cryptage, ou en utilisant cryptage asymétrique et avoir L'OS protéger le cert), puis le stocker dans un fichier de configuration (en dehors du répertoire web) avec forte ACLs .

3
répondu AviD 2008-09-20 21:17:12

il suffit de le mettre dans un fichier de configuration quelque part est la façon dont il est habituellement fait.

  1. interdire l'accès aux bases de données à partir de tout serveur en dehors de votre réseau,
  2. prendre soin de ne pas montrer accidentellement le mot de passe aux utilisateurs (dans un message d'erreur, ou à travers des fichiers PHP accidentellement servi comme HTML, etcetera.)
3
répondu Marijn 2014-03-10 03:14:41

nous l'avons résolu de cette façon:

  1. utilisez memcache sur le serveur, avec une connexion ouverte à partir d'un autre serveur de mots de passe.
  2. enregistrer à memcache le mot de passe (ou même tout le mot de passe.php fichier crypté) plus la clé de décryptage.
  3. le site web, appelle la clé memcache contenant le mot de passe passphrase et décrypte en mémoire tous les mots de passe.
  4. le serveur de mots de passe envoie un nouveau mot de passe crypté classer toutes les 5 minutes.
  5. si vous utilisez un mot de passe crypté.php sur votre projet, vous avez mis un audit, qui vérifie si ce fichier a été touché de l'extérieur - ou vu. Lorsque cela se produit, vous pouvez automatiquement nettoyer la mémoire, ainsi que fermer le serveur pour l'accès.
3
répondu Asi Azulay 2016-08-28 16:27:10