Cachez ces passwords que je ne saurais voir
Attention: cet article date du 2 mai 2012
Ce qu'il contient est peut être encore valable...
... ou complètement obsolète!
Il n’est pas rare de devoir faire trainer des mots de passe ou des données sensibles dans des scripts PHP. Outre que c’est indispensable, ce n’est pas une chose mauvaise en soi (rappelons le, les sources PHP restent sur le serveur).
Pour sécuriser un peu plus, pourquoi ne pas utiliser une méthode plus furtive encore?
Et qu’y a-t-il de plus furtif qu’un Apache ?
L’idée est ici de sortir des fichiers PHP des valeurs, afin que celles ci soient:
- centralisées, en un seul point (le fichier .htaccess en l’occurrence)
- sécurisées, car ce fichier est caché, non accessible de l’extérieur
Le principe est donc simple:
- définir des variables d’environnement dans le fichier
- créer une classe pour y accéder
- et c’est tout… :-)
Étape 1: définition
Ajoutez dans le fichier .htaccess la création des variables d’environnement :
SetEnv MYSQL_USER monnom SetEnv MYSQL_PASS VABVZ1D05UZ1FnC25aO1V0C2dbMlUy
Ou toute autre valeur bien sûr…
Ne reste plus qu’à tester en affichant une page quelconque.
Si cela ne marche pas, Apache vous servira un:
Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request.
C’est violent mais efficace.
Étape 2: accéder aux valeurs
On les récupère via la fonction getenv() ou la variable $_SERVER (voir exemple plus loin).
Histoire de faire propre (et d’envisager d’éventuelles évolutions), nous allons créer une petite classe permettant de manipuler les valeurs, c’est à dire de les récupérer:
class htaccess { public function getMysqlUser() { return getenv('MYSQL_USER'); } public function getMysqlPass() { return getenv('MYSQL_PASS'); } }
Ne reste plus enfin qu’à exploiter la chose lors d’une connexion à la base MySQL :
$env = new htaccess(); try { $cnx = new PDO('mysql:host=localhost;dbname=test', $env->getMysqlUser(), $env->getMysqlPass() ); } catch(PDOException $e) { echo $e->getMessage(); }
Bien sûr, tout ceci sera a mettre dans le fichier de configuration de votre application.
Étape 3: aller plus loin
J’avais utilisé une méthode comparable pour définir des options de développements propre à deux environnements, l’un pour la version locale, l’autre pour la version en ligne.
Ce qui donnait pour le fichier .htaccess (local):
SetEnv ThisIsLocal true
Et rien sur le fichier en ligne, auquel je n’avais pas accès. Puis, en PHP, un simple test sur l’existence de notre variable:
if ( isset( $_SERVER['ThisIsLocal'] ) ) { ... }
Chose importante, Apache regarde l’arborescence pour appliquer une directive à un répertoire. Donc, si une variable d’environnement est définie à la racine, elle existera dans tous les sous dossiers / répertoires / projets, etc. Votre authentification Mysql ainsi défini sera valable en un point unique pour toute l’arborescence (sauf de préciser un autre fichier .htaccess quelque part bien sûr). Avec l’avantage non négligeable de pouvoir changer le mot de passe de tout votre site (ou vos sites) en une seule opération.
Dans le même esprit, les variables d’environnement étant de portées globales (comme la variable $_SERVER) vous pouvez y accéder dans tous vos fichiers PHP, y compris dans les classes et fonctions.
Si vous voyez d’autres usages… ?