PRATIQUE PHP 
PHP 5 : créer une connexion sécurisée vers MySQL
 
Grâce aux fonctionnalités SSL du SGBD Open Source, il est possible en quelques appels de fonctions de construire une connexion fiable vers les données dynamiques. (17/11/2006)
  Forum

Réagissez dans les forums de JDN Développeurs

Gérer au mieux ses utilisateurs MySQL n'est pas forcément la manière la plus efficace d'assurer la sécurité de ses données, et certainement pas la seule. Ces données restent également vulnérables lors du transfert entre le serveur de base de données et le client - ici, le langage de programmation PHP.

Tout transfert de données sur un réseau, même privé, peut être lu, voire modifié, même si les données sont compressées. Les mécanismes d'OpenSSL, intégrés à MySQL, assurent un chiffrement efficace.

Si MySQL est conçu pour reconnaître les connexions SSL, cette méthode n'est pas activée par défaut car elle ralentit le traitement des données, ce qui est l'une des forces de MySQL. La plupart de ses installations ne s'en servent donc pas pour assurer un service rapide, mais certains services critiques se justifient la plupart du temps face à l'énorme gain de sécurité. Il reste par ailleurs possible de n'utiliser SSL que pour certaines connexions précises, laissant les autres conserver la configuration rapide par défaut.

La fonction dédiée de PHP se nomme mysqli_ssl_set(). Rappellons que les fonctions mysqli_* de PHP prennent en compte les fonctionnalités avancées de MySQL à partir de la version 4.1.0, ce qui n'est pas le cas des fonctions mysql_* (elles restent néanmoins compatibles avec MySQL). De fait, cette fonction est limitée à PHP 5 : sous PHP 4, mysql_connect() dispose d'un drapeau booléen MYSQL_CLIENT_SSL pour activer ce mode.

Sous PHP 5, le code de connexion prendra cette forme. Notez qu'il faut toujours invoquer mysqli_ssl_set() avant mysqli_real_connect(), qui sans cela n'agira pas.
  1. $init = mysqli_init();
  2. mysqli_ssl_set( $init, "cheminFichierClefs", "cheminFichierCertificats", "cheminFichierCertificatsDAutorités", "cheminDossierCertificatsSSL", "nombreAutoriséPourChiffrage");
  3. if ($connexion = @mysqli_real_connect($init, "localhost", "utilisateur", "motDePasse", "baseDeDonnées") ) {
  4.   $connexion = $init;
  5.   }
La connexion ensuite s'utilise naturellement, les données échangées seront cryptées selon la configuration.

 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page