Cela m'a toujours dérangé que de nombreux programmes PHP demandent à l'utilisateur de stocker le mot de passe mysql en texte brut (dans une chaîne ou une constante) dans un fichier de configuration à la racine de l'application.
Y a-t-il une meilleure approche à cela après toutes ces années?
Jusqu'à présent, j'ai trouvé deux améliorations de sécurité minimales:
rendre le fichier illisible via le web en utilisant les règles dans .htaccess (au cas où php échouerait ou qu'il y aurait une vulnérabilité de sécurité pour lire la source php)
détruire le mot de passe en mémoire une fois la connexion db établie (non définie) (pour empêcher les vidages de chaîne d'une violation de sécurité, d'une injection, etc.)
mais bien sûr, ni l'un ni l'autre ne résout le problème d'origine.
Merci pour toutes autres idées!
Étant donné que votre code aura besoin du mot de passe, il n'y a pas de sécurité parfaite. Mais vous pouvez rendre la récupération difficile.
J'ai mis un peu de hachage dans ma configuration Web, en tant que variable d'environnement, dites MYSQL_PASS_HASH
Ensuite, je fais quelque chose comme md5(getenv('MYSQL_PASS_HASH').'gibberish$qwefsdf')
qui est alors le mot de passe. Bien sûr, vous devriez unsetenv
après cela si vous êtes paranoïaque.
Votre mot de passe ne sera pas littéralement stocké quelque part, et il ne peut être récupéré que lorsque quelqu'un a votre configuration Web et votre base de données comprend.
Cela se produit dans un fichier en dehors de la racine Web (ne faites pas entièrement confiance à .htaccess
).
Personnellement, je stocke des informations sensibles telles que les détails de connexion à la base de données dans un fichier config.ini en dehors de la racine de mon dossier Web. Alors dans mon index.php je peux faire:
$config = parse_ini_file('../config.ini');
Cela signifie que les variables ne sont pas visibles si votre serveur commence accidentellement à générer PHP en texte brut (ce qui s'est déjà produit, tristement célèbre pour Facebook); et uniquement PHP les scripts ont accès aux variables.
Il ne dépend pas non plus de . Htaccess dans lequel il n'y a aucune contingence si votre fichier . Htaccess est déplacé ou détruit.
Avertissement, ajouté le 14 février 2017: Je vais maintenant stocker des paramètres de configuration comme celui-ci en tant que variables d'environnement. Je n'ai pas utilisé l'approche de fichier . Ini depuis un certain temps maintenant
Garder vos fichiers de configuration en dehors de la racine de votre document est un moyen populaire d'améliorer la sécurité des fichiers de configuration.
Certes, vous ne devez jamais stocker un mot de passe dans un fichier texte brut à la racine du document. Les mesures supplémentaires que vous prendrez pour le sécuriser dépendront du niveau d'accès dont vous disposez pour configurer votre serveur Web.
Vous pouvez définir le mot de passe dans php.ini (ou via le paramètre ini dans la configuration Apache ou .htaccess). Ou définissez-le dans l'environnement lorsque vous démarrez votre serveur Web.
Il ne sert à rien de simplement chiffrer le mot de passe - cela signifie que vous devez stocker une clé de déchiffrement - à moins que vous n'utilisiez le mot de passe fourni par l'utilisateur avec l'authentification par quorum pour déchiffrer le mot de passe (mais cela empêche les sessions non authentifiées d'accéder à la base de données et devient désordonné lorsque vous devez ajouter de nouveaux utilisateurs au quorum).
Si c'est un package d'hébergement bon marché et que vous n'avez pas de stockage accessible en dehors de la racine du document, le stockage du mot de passe dans un fichier inclus php devrait empêcher qu'il soit exposé (le fichier sera analysé par php avant d'être téléchargé). Alternativement, simplement nommer le fichier avec un ".ht" au début peut empêcher l'accès à distance.
Notez que votre deuxième option est quelque peu redondante - si quelqu'un peut faire autant de dégâts à votre code, il n'a pas besoin d'extraire le mot de passe du code en cours d'exécution.
Il n'y a vraiment pas de solution au problème.
C.
En plus de stocker correctement ces données sensibles, vous devez également créer un utilisateur MySQL séparé qui n'a que le privilèges et restreindre l'accès à la base de données/tables/vues dont il a besoin. accès à. Et comme le serveur de base de données est souvent exécuté sur la même machine que le serveur Web, limitez également l'accès aux accès locaux. N'utilisez donc pas l'utilisateur avec des privilèges root s'il a juste besoin de lire les données d'une seule base de données/table.
Si vous êtes prêt à échanger la disponibilité pour la sécurité des fichiers, vous pouvez retirer le mot de passe du fichier de configuration et demander à un administrateur de le saisir lors du démarrage et de le stocker dans une variable globale.
Vous devez toujours vous assurer que vous êtes à l'abri des attaques par injection qui pourraient vider cette variable, et bien sûr, vous avez une étape manuelle dans le processus de (re) démarrage.
Il ne doit pas nécessairement figurer dans la racine Web. Vous pouvez déplacer le fichier en dehors de la racine Web et l'appeler ainsi. Cela signifie simplement que le fichier ne peut pas être appelé directement à partir du Web.
Si votre code comporte des failles de sécurité, telles que l'inclusion de choses sans filtrage à partir des données GET, ce fichier est toujours à risque. La vraie clé est de s'assurer que votre application est également sécurisée.