Lorsqu'une application PHP établit une connexion à une base de données, elle doit bien entendu généralement transmettre un identifiant et un mot de passe. Si j'utilise une seule connexion avec des autorisations minimales 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 l'écrire dans le code PHP ne soit pas une bonne idée.
404
Réponses:
Plusieurs personnes ont mal interprété cela comme une question sur la façon de stocker les 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'accéder à la base de données.
La solution habituelle consiste à déplacer le mot de passe hors 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 façon, les développeurs n'ont besoin de rien savoir sur les mots de passe de production, et il n'y a aucun enregistrement du mot de passe dans votre contrôle de source.
la 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 .htaccess:
la source
Le moyen le plus sûr est de ne pas avoir du tout les informations spécifiées dans votre code PHP.
Si vous utilisez Apache, cela signifie définir les détails de connexion dans votre fichier de fichier httpd.conf ou virtual hosts. 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:
Ensuite, vous ouvrez votre connexion mysql comme ceci:
Ou comme ça:
la source
ini_get()
.but any user (or a hacker abusing badly written php script) can read the password via ini_get()
Comment gérez -vous cela?ini_get()
ougetenv()
.Stockez-les dans un fichier en dehors de la racine Web.
la source
include('../otherDirectory/configfile.conf')
?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 invite ensuite l'administrateur système à saisir la clé de déchiffrement. Le mot de passe de la base de données est ensuite lu dans le fichier de configuration, déchiffré et stocké en mémoire pour une utilisation future. Toujours pas sûr à 100% car il est stocké dans la mémoire déchiffrée, mais vous devez l'appeler `` suffisamment sécurisé '' à un moment donné!
la source
Cette solution est générale, en ce sens qu'elle est utile pour les applications open source et fermées.
Avantages:
Cette méthode est suggérée par Heroku, qui a beaucoup de succès.
la source
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 connect.
Sinon, il est préférable de désactiver les informations d'identification après l'instruction connect, car les informations d'identification qui ne sont pas en mémoire ne peuvent pas être lues depuis la mémoire ;)
la source
Vos choix sont plutôt 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 séparé plutôt que dans le script principal. Veillez ensuite à le stocker en dehors de l'arborescence Web principale. En cas de problème de configuration Web qui laisse vos fichiers php affichés simplement 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 la bonne voie avec un accès minimal au compte utilisé. Ajouté à cela
Peter
la source
Si vous utilisez PostgreSQL, il recherche
~/.pgpass
automatiquement les mots de passe. Voir le manuel pour plus d'informations.la source
Auparavant, nous stockions l'utilisateur DB / pass dans un fichier de configuration, mais avons depuis frappé 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 et il est donc possible qu'un pirate puisse lire ces informations. Les fichiers de configuration peuvent également être pris dans le contrôle de version ou copiés sur les serveurs.
Nous sommes passés au stockage des variables d'environnement user / pass dans l'ensemble Apache VirtualHost. Cette configuration n'est lisible que par root - espérons que votre utilisateur Apache ne s'exécute pas en tant que root.
L'inconvénient est que maintenant le mot de passe est dans une variable PHP globale.
Pour atténuer ce risque, nous avons les précautions suivantes:
phpinfo()
est désactivé. PHPInfo est une cible facile pour obtenir un aperçu de tout, y compris des variables d'environnement.la source
Mettez le mot de passe de la base de données dans un fichier, rendez-le en lecture seule pour l'utilisateur qui sert les fichiers.
Sauf si vous avez un moyen d'autoriser uniquement le processus du serveur php à accéder à la base de données, c'est à peu près tout ce que vous pouvez faire.
la source
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.
Il vous suffit de vous assurer que le fichier php contenant le mot de passe dispose des autorisations appropriées. C'est-à-dire qu'il ne doit être lisible que par le serveur Web et par votre compte d'utilisateur.
la source
Le mettre dans un fichier de configuration quelque part est la façon dont cela se fait habituellement. Assurez-vous simplement:
la source
Nous l'avons résolu de cette façon:
la source
Une astuce supplémentaire consiste à utiliser un fichier de configuration PHP séparé qui ressemble à ceci:
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" quittera simplement le script à la première ligne, il est donc encore plus difficile d'obtenir les 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 va dans des dossiers hors ligne.
la source
require
/include
mais comment éviter de fairefopen
?Le meilleur moyen est de ne pas stocker du tout le mot de passe!
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 le chiffrer , en utilisant un chiffrement fort (par exemple en utilisant AES-256, puis en protégeant la clé de chiffrement, ou en utilisant un chiffrement asymétrique et que le système d'exploitation protège le certificat), puis stockez-le dans un fichier de configuration (en dehors du répertoire Web) avec des ACL solides .
la source