Quand une application PHP établit une connexion à une base de données, elle doit bien sûr généralement passer un identifiant et un mot de passe. Si j'utilise un seul identifiant et une autorisation minimale pour mon application, alors le PHP doit savoir cet identifiant et ce mot de passe quelque part. Quel est le meilleur moyen de sécuriser ce mot de passe? Il semble que le fait d'écrire dans le code PHP n'est pas une bonne idée.
Plusieurs personnes ont mal interprété cela comme une question sur la manière de stocker les mots de passe dans une base de données. C'est faux. Il s'agit de la façon de stocker le mot de passe qui vous permet d’obtenir to la base de données.
La solution habituelle consiste à déplacer le mot de passe du code source dans un fichier de configuration. Laissez ensuite l’administration et la sécurisation de ce fichier de configuration à vos administrateurs système. De cette manière, les développeurs n'ont pas besoin de connaître les mots de passe de production et le mot de passe n'est pas enregistré dans votre contrôle de code source.
Si vous hébergez sur le serveur de quelqu'un d'autre et que vous n'avez pas accès en dehors de votre racine Web, vous pouvez toujours mettre votre mot de passe et/ou votre connexion à la base de données dans un fichier, puis verrouiller le fichier à l'aide d'un fichier .htaccess:
<files mypasswdfile>
order allow,deny
deny from all
</files>
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 fichier de fichier httpd.conf ou hôtes virtuels. Si vous faites cela, vous pouvez appeler mysql_connect () sans aucun paramètre, ce qui signifie que PHP ne fournira 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
Ensuite, 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"));
Stockez-les dans un fichier en dehors de la racine Web.
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 (lui-même sécurisé par l'administrateur système). Au démarrage de l'application/du serveur, l'application demande ensuite à l'administrateur système la clé de déchiffrement. Le mot de passe de la base de données est ensuite lu à partir du fichier de configuration, déchiffré et stocké en mémoire pour une utilisation ultérieure. Toujours pas 100% sécurisé car il est stocké dans la mémoire déchiffrée, mais vous devez l'appeler "suffisamment sécurisé" à un moment donné!
Cette solution est générale, en ce sens qu’elle est utile pour les applications à source ouverte et à source fermée.
Avantages:
Cette méthode est suggérée par Heroku, qui a beaucoup de succès.
s'il est possible de créer la connexion à la base de données dans le même fichier où les informations d'identification sont stockées. Insérez les informations d'identification dans l'instruction de connexion.
mysql_connect("localhost", "me", "mypass");
Sinon, il est préférable de supprimer les informations d'identification après l'instruction de connexion, car les informations d'identification qui ne sont pas en mémoire ne peuvent pas être lues à partir de la mémoire ;)
include("/outside-webroot/db_settings.php");
mysql_connect("localhost", $db_user, $db_pass);
unset ($db_user, $db_pass);
Vos choix sont en quelque sorte limités car 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 séparé plutôt que dans le script principal. Assurez-vous ensuite de le stocker en dehors de l'arborescence Web principale. C'était 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.
En dehors de cela, vous êtes sur les bonnes lignes avec un accès minimal au compte utilisé. Ajouté à cela
Peter
Si vous utilisez PostgreSQL, le système recherche automatiquement les mots de passe dans ~/.pgpass
. Voir le manuel pour plus d'informations.
Auparavant, nous stockions des utilisateurs/pass de base de données dans un fichier de configuration, mais nous avons depuis lors atteint le mode paranoïaque - en adoptant une politique de défense en profondeur .
Si votre application est compromise, l'utilisateur aura un accès en lecture à votre fichier de configuration. Il est donc possible qu'un pirate informatique lise ces informations. Les fichiers de configuration peuvent également être pris dans le contrôle de version ou copiés sur des serveurs.
Nous sommes passés au stockage utilisateur/pass dans les variables d’environnement définies dans Apache VirtualHost. Cette configuration est uniquement lisible par root. J'espère que votre utilisateur Apache ne fonctionne pas en tant que root.
Le problème avec ceci est que maintenant le mot de passe est dans une variable globale PHP.
Pour atténuer ce risque, nous prenons les précautions suivantes:
phpinfo()
est désactivé. PHPInfo est une cible facile à utiliser pour obtenir une vue d'ensemble de tout, y compris des variables d'environnement.Placez le mot de passe de la base de données dans un fichier, en lecture seule pour l'utilisateur qui fournit les fichiers.
À moins que vous n'ayez certains moyens d'autoriser uniquement le processus du serveur php à accéder à la base de données, c'est quasiment tout ce que vous pouvez faire.
Si vous parlez du mot de passe de la base de données, par opposition au mot de passe d'un navigateur, la pratique habituelle semble être de le placer dans un fichier de configuration PHP sur le serveur.
Vous devez simplement vous assurer que le fichier php contenant le mot de passe dispose des autorisations appropriées. C'est à dire. il ne doit être lisible que par le serveur Web et par votre compte utilisateur.
Nous l'avons résolu de cette façon:
Une astuce supplémentaire consiste à utiliser un fichier de configuration séparé PHP qui ressemble à ceci:
<?php exit() ?>
[...]
Plain text data including password
Cela ne vous empêche pas de définir correctement les règles d'accès. Mais si votre site Web est piraté, un "requis" ou un "inclure" quittera simplement le script à la première ligne, ce qui rendra encore plus difficile l'obtention des données.
Néanmoins, ne laissez jamais les fichiers de configuration dans un répertoire accessible via le Web. Vous devriez avoir un dossier "Web" contenant votre code de contrôleur, css, images et js. C'est tout. Tout le reste est placé dans des dossiers hors connexion.
Le meilleur moyen est de ne pas stocker le mot de passe du tout!
Par exemple, si vous utilisez 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, commencez par encrypt, en utilisant un cryptage renforcé (par exemple, en utilisant AES-256, puis protégez la clé de cryptage, ou en utilisant un cryptage asymétrique et laissez le système d'exploitation protéger le cert) , puis enregistrez-le dans un fichier de configuration (en dehors du répertoire Web) avec ACL fortes.
Il suffit de le placer dans un fichier de configuration quelque part, comme cela se fait habituellement. Assurez-vous simplement de: