PHP et MySQL - Comment éviter mot de passe dans le code source? [dupliquer]

cette question a déjà une réponse ici:

j'ai une petite application PHP qui stocke des données dans une base de données MySQL . Actuellement nom d'utilisateur / mot de passe sont codés dur dans le code PHP. Une situation que je ne pas vraiment aimer, 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 dépôt), et de le coder d'une façon ou d'une autre, donc n'est pas directement lisible (obscurcissement). Est-il meilleur et facile à utiliser pour résoudre le problème?

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

portée: je veux établir une solution robuste, mais aussi facile à l'utilisation. Je veux une sécurité raisonnable, mais je le suis. pas affaire à des données hautement confidentielles ici.

Remarque: Il n'est plus recommandé d'utiliser les fonctions mysql_connect , voir Stack Overflow question pourquoi ne devrais-je pas utiliser les fonctions mysql_ en PHP?*. J'aurais pu changer l'exemple du code, mais puisque certains commentaires y font référence, je ne l'ai pas fait. Toutefois, la nature initiale de la question demeure valable.

108
demandé sur Community 2013-02-26 16:19:28

9 réponses

la façon la plus simple est, comme vous l'avez dit, d'utiliser un fichier de configuration.

beaucoup de cadres utilisent ceci ( Zend , CakePHP , Kohana , etc) et c'est la manière la plus commune de faire les choses (même dans un environnement Non-PHP tel que ASP.NET avec ses fichiers web.config ). Cela vous permet également de copier les valeurs de configuration de l'environnement à l'environnement en copiant simplement les fichiers pour le site, 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 la dissimulation du mot de passe puisque ce n'est pas un fichier accessible dans le monde entier, il ne devrait certainement pas être accessible sur le web. Ce que je veux dire par là, c'est que vous voulez soit a) dire à votre serveur web de ne pas servir votre fichier de configuration ( IIS fait déjà cela avec web.config fichiers et sert un statut HTTP 404.8 à la place ou B) le déplacer hors de votre répertoire web. Si quelqu'un peut voir votre fichier de configuration, c'est pire que de l'avoir dans votre code source.

ce sera aussi une bonne idée d'avoir une version de base (vide / par défaut) du fichier de configuration, et de le séparer par environnement, afin 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 la plus une façon courante de différencier ces environnements, quelque chose 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 façon assez courante est d'utiliser un fichier de configuration XML et de ne le lire que dans les valeurs dont vous avez besoin comme approprié (stockage d'une copie mise en cache du fichier de configuration en mémoire). Cela peut très facilement être limité à charger seulement dans certaines valeurs, plutôt que de permettre l'inclusion arbitraire de fichiers PHP et est globalement une meilleure solution à mon avis, mais le ci-dessus vous devriez commencer dans la bonne direction.

vous voudrez probablement que votre VCS ignore le fichier. D'un autre côté, vous pourriez vouloir qu'un squelette du fichier, ou un avec des valeurs par défaut raisonnables (ce dernier ne s'applique pas aux données de connexion, bien sûr), soit contrôlé en version. Une façon courante de traiter cela est d'avoir un fichier de configuration de modèle enregistré, et la procédure d'installation copie ce fichier à l'emplacement de la configuration réelle fichier, où il est personnalisé. Cela peut être manuel ou automatisé, processus.

(bien que quelque peu sans rapport avec la question principale, l'introduction d'une constante pour votre environnement vous permet de faire d'autres choses cool comme reporter à une mise en œuvre de courrier faux au lieu d'un live SMTP un, mais bien sûr, cela pourrait également être fait avec un fichier de configuration)

"
66
répondu Rudi Visser 2013-04-19 17:30:44

une très bonne solution, si vous êtes sur Apache, il pour stocker les informations dans la configuration virtualhost

SetEnv  MYSQL_USER     "xx"
SetEnv  MYSQL_PASSWORD "y2wrg435yw8"

les données peuvent être facilement récupérées en utilisant $_ENV[] pour une utilisation dans le code.

44
répondu hank 2013-02-26 12:24:11

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

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

10
répondu acutesoftware 2013-04-19 17:35:44

si vous estimez que la méthode 12factor est valable, ils recommandent de stocker config dans l'environnement.

ceci a l'avantage supplémentaire de vous permettre d'écrire le même code exact quand vous testez ou autrement dans un environnement non-production. Si vous voulez (ou avez besoin) de changer la base de données, ou quoi que ce soit d'autre, il n'y a pas besoin de modifier votre code - vous modifiez simplement les variables d'environnement et vous êtes bon pour aller.

5
répondu Wayne Werner 2013-02-26 15:44:24

ce que je ferais, c'est de ne stocker que des fichiers d'exemple de configuration dans le dépôt, comme config.php.dist et ne mettez pas la configuration réelle.php sous contrôle de version.

2
répondu Serge Kuharev 2013-02-26 12:21:32

bonne question. Vous pouvez déplacer les éléments les plus sensibles (par exemple clés/Mots de passe) en tant que variables d'environnement, mais cela ne ferait que reporter le problème à la configuration de votre serveur (qui se trouve probablement aussi dans un dépôt).

vous pouvez également essayer d'éviter les mots de passe pour des choses comme la base de données, en le rendant mot de passe moins et le sécuriser derrière un pare-feu à la place. Aucune de ces solutions n'est parfaite, mais ce sont les approches que je connais.

2
répondu troelskn 2013-02-26 12:26:17

c'est une bonne idée de déplacer le mot de passe du code à un fichier de configuration, de sorte que le mot de passe ne sera pas dans le dépôt. L'idée de le chiffrer dans un fichier de configuration est discutable, car celui qui a le fichier de configuration + le code PHP qui le déchiffre peut toujours exécuter le code et obtenir un mot de passe en clair. Il serait probablement préférable de conserver le mot de passe dans un fichier de configuration sous forme de texte clair et de réfléchir à la façon de protéger le fichier de configuration contre tout accès non autorisé.

2
répondu Mikhail Vladimirov 2013-04-19 17:32:20

Je ne vois pas tout ce problème ici. Si vous partagez un dépôt, vous ne voulez probablement pas de mots de passe et de configuration de code dur. Vous devriez fournir par défaut un à la place:

host: localhost
user: root
pass: root
name: db

si vous voulez vraiment vous pouvez utiliser et analyser un fichier .ini mais il est probable que ce soit très lent comparé à un tableau étant défini dans le code source et ne fait pas vraiment beaucoup de sens pour moi.

rappelez-vous: la seule chose en laquelle vous pouvez avoir confiance est votre le code source, s'ils peuvent l'avoir, tu es foutu de toute façon.

1
répondu Shoe 2013-02-26 12:28:54

vous pouvez toujours créer un fichier de configuration ini en utilisant la fonction parse_ini_file .

1
répondu Dawid Sajdak 2013-04-19 17:33:25