Readme

Cet article vous donne un moyen sûr de vous prémunir des injections SQL en PHP.

En informatique la sécurité est plus qu'un droit : c'est un devoir ; il est de la responsabilité du détenteur du site de mettre tout en oeuvre pour protéger les données de son site, dans le cas contraire il peut s'exposer à des poursuites pénales.

Les données envoyées par le client au serveur doivent être traitrées avec beaucoup de prudence car elles ne correspondent pas toujours à ce que vous voulez. Si aucun mécanisme de protection n'est mis en place une simple chaîne de caractères peut permettre de lire des données ou de les modifier.

Vous devez absoluement posséder une base de données active et un serveur PHP.

Fonction php avec MySQL

La fonction mysql_real_escape_string() requiert une connexion à une base de données MySQL pour récupérer le jeu de caractères autorisés.
<?php
    /**
     * Sécurisation des valeurs passées contre les injections SQL/JS et encodage des caractères spéciaux
     * /!\ Nécessite une connexion à la base pour récupérer le jeu de caractères
     * Entrée : la valeur à sécuriser et l'identifiant de connexion
     * Sortie : la valeur sécurisée ou false en cas d'échec de connexion ou de transformation
     */
    function safe($value, $connex){
        if ( !$connex )
            return false;
           
        if( is_string($value) )
            $value = mysql_real_escape_string(htmlspecialchars($value));
       
        if( is_array($value) )
            array_walk($value, create_function('&$n', '$n = mysql_real_escape_string(htmlspecialchars($n));') );

        return $value;
    }

Vous n'utilisez pas MySQL ?

La fonction mysql_real_escape_string() employée dans ce script est spécifique à MySQL. Voici les équivalences pour les gestionnaires de base de données les plus courants :
Gest. BDFonction à utiliser
MySQL mysql_real_escape_string()
Oracle Ne possède pas de fonction d'échapement : utilisez addslashes()
PostgreSQL pg_escape_string()
SQLite sqlite_escape_string()

Exemple d'utilisation

Lorsque vous devez utiliser des données issues d'un formulaire, vous pouvez appliquer la fonction safe() sur la variable $_POST (ou $_GET). Voici deux possibilités :
  • passer la variable en référence pour qu'elle soit modifiée : safe(&$_POST, $connex);
  • ou récupérer la contenu dans une nouvelle variable : $resultat = safe($_POST, $connex);

Remarques

  • Emploi : les données stockées dans les cookies peuvent êtres modifiés côté client, il peut être utile de contrôler leur contenu ; à contrario il est inutile d'utiliser safe() sur des variables affectées au niveau du serveur ;
  • Test : ce script a été testé mais il vous incombe de faire vos propres tests de vérification afin de vous assurer qu'il correspond bien à votre but ;
  • Évitez les redondances : si vous avez fait une vérification de la validité de l'identifiant de connexion avant de le passer en paramêtre alors vous pouvez supprimer les 3 premières lignes de safe().