112 votes

PHP et MySQL - comment éviter les mots de passe dans le code source ?

J'ai une petite application PHP qui stocke des données dans une base de données. MySQL de la base de données. Actuellement, le nom d'utilisateur et le mot de passe sont codés en dur dans le code PHP. Une situation que je n'aime pas vraiment, par exemple, puisque le code est également disponible dans un dépôt.

La meilleure idée que j'ai est de déplacer les données du code vers un fichier de configuration (exclu du référentiel), et de les coder d'une manière ou d'une autre, afin qu'elles ne soient pas directement lisibles (obfuscation). Existe-t-il un moyen plus efficace et plus facile à utiliser pour résoudre ce problème ?

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) { 
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

Scope : Je veux établir une solution robuste, mais aussi facile à utiliser. Je veux une sécurité raisonnable, mais je n'ai pas affaire ici à des données hautement confidentielles.

Remarques : Il n'est plus recommandé d'utiliser l'option mysql_connect voir la question de Stack Overflow Pourquoi ne devrais-je pas utiliser mysql_ en PHP ? *. J'aurais pu modifier l'exemple de code, mais comme certains commentaires y font référence, je ne l'ai pas fait. Cependant, la nature originale de la question reste valable.

68voto

Rudi Visser Points 11599

Le moyen le plus simple est, comme vous l'avez dit, d'utiliser un fichier de configuration.

De nombreux frameworks l'utilisent ( Zend , CakePHP , Kohana ) et c'est la façon la plus courante de faire les choses (même dans un environnement non-PHP tel que ASP.NET avec son système de gestion de l'espace et des ressources). web.config fichiers). Cela vous permet également de copier les valeurs de configuration d'un environnement à l'autre en copiant simplement les fichiers du site, ce qui est un avantage par rapport aux variables d'environnement de configuration du serveur (qui peuvent très rapidement être perdues et oubliées).

Vous ne devriez pas avoir à vous soucier de l'obscurcissement du mot de passe puisqu'il ne s'agit pas d'un fichier accessible au monde entier, et certainement pas d'un fichier accessible sur le Web. Ce que je veux dire par là, c'est que vous devriez soit a) dire à votre serveur web de ne pas servir votre fichier de configuration ( IIS le fait déjà avec web.config et sert un statut HTTP 404.8 au lieu du contenu) ou b) le déplacer en dehors de votre répertoire de service web. Si quelqu'un peut voir votre fichier de configuration, c'est pire que de l'avoir dans votre code source.

C'est aussi une bonne idée d'avoir une version de base (vide / par défaut) du fichier de configuration, et de la séparer par environnements, de sorte que vous puissiez avoir un fichier de configuration différent pour les plateformes de production, de développement et de test.

Une variable d'environnement est le moyen le plus courant de différencier ces environnements, un peu comme le code ci-dessous :

// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
    // Copy from web server to PHP constant
    define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}

if (!defined('ENVIRONMENT')) {
    // Default to development
    define('ENVIRONMENT', 'development');
}

// Load in default configuration values
require_once 'config.default.php';

// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';

Une autre méthode assez courante consiste à utiliser un fichier de configuration XML et à ne lire que les valeurs dont vous avez besoin (en stockant une copie en cache du fichier de configuration en mémoire). Cette méthode peut très facilement être restreinte pour ne charger que certaines valeurs, plutôt que de permettre l'inclusion arbitraire de fichiers PHP, et c'est globalement une meilleure solution à mon avis, mais ce qui précède devrait vous mettre sur la bonne voie.

Vous voudrez probablement que votre VCS pour ignorer le fichier. D'autre part, vous pouvez souhaiter qu'un squelette du fichier, ou un fichier avec des valeurs par défaut raisonnables (ce dernier point ne s'applique pas aux données de connexion, bien sûr), soit contrôlé par version. Une façon courante de gérer cela est d'avoir un fichier de configuration modèle enregistré, et la procédure d'installation copie ce fichier à l'emplacement du fichier de configuration réel, où il est personnalisé. Il peut s'agir d'un processus manuel ou automatisé.

_(Bien que cela n'ait rien à voir avec la question principale, l'introduction d'une constante pour votre environnement vous permet de faire d'autres trucs sympas comme vous référer à une fausse implémentation de courrier au lieu d'une implémentation réelle <a href="http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol">SMTP </a>un, mais bien sûr cela pourrait aussi être fait avec un fichier de configuration)_

46voto

hank Points 2612

Une solution intéressante, si vous utilisez Apache, consiste à stocker les informations dans la configuration du serveur virtuel.

SetEnv  MYSQL_USER     "xx"
SetEnv  MYSQL_PASSWORD "y2wrg435yw8"

Les données peuvent facilement être récupérées en utilisant $_ENV[] à utiliser dans le code.

11voto

acutesoftware Points 757

Comme d'autres l'ont mentionné, mettez-le dans un fichier de configuration séparé en dehors du contrôle de la source (évidemment, cela sera mentionné dans le code qui est sous contrôle de la source).

C'est aussi une bonne idée de nommer le fichier config.php plutôt que config.ini au cas où le répertoire serait accidentellement exposé, ce qui signifie que le fichier ne sera pas téléchargé, mais il ne renvoie rien.

5voto

Wayne Werner Points 10172

Si vous estimez que le 12facteur est précieux, ils recommandent de stocker la configuration dans l'environnement.

Cela présente l'avantage supplémentaire de vous permettre d'écrire l'adresse de l'utilisateur. exactement le même code lorsque vous effectuez des tests ou dans un environnement de non-production. Si vous voulez (ou devez) modifier la base de données, ou quoi que ce soit d'autre, il n'est pas nécessaire de modifier votre code - vous changez simplement les variables d'environnement et vous êtes prêt à partir.

2voto

Serge Kuharev Points 612

Ce que je ferais, c'est de ne stocker que le fichier de configuration d'exemple dans le référentiel, comme config.php.dist, et de ne pas placer le fichier config.php réel sous contrôle de version.

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