InjectionSQL : comment éviter un problème de sécurité en PHP

Injection SQL : comment éviter un problème de sécurité en PHP

Quelque soit l’expérience, le niveau de compréhension, la dextérité d’un développeur web, l’un des problèmes majeurs qu’il doit garder à l’esprit tout au long de la phase de développement, c’est la SECURITE. Les clients sont de plus en plus conscients des problèmes de sécurité sur internet et sont donc plus préoccupés par ces questions en ce qui concerne leur propre site web. Concernant le langage de programmation PHP, l’injection SQL est une menace pour les sites web dont les données stockées sont issues de sources distantes.

Aujourd’hui, nous allons présenter une vue d’ensemble de cette menace pour la sécurité ainsi qu’un conseil pour aider les développeurs à éviter ce problème en rendant les requêtes SQL moins vulnérables.

Qu’est-ce que l’injection SQL ?

Une injection SQL est une insertion non désirée de requête SQL dans votre base de données, effectuée par un assaillant. La déclaration de requête SQL est la plupart du temps réalisée lorsque l’application demande à l’utilisateur de saisir des données telles que son nom ou d’autres renseignements personnels, ou encore les données requises par les formulaires d’authentification ou de connexion. La déclaration insérée par l’attaquant s’exécute alors dans la base de données à votre insu.
Le but de cette insertion est de permettre à l’assaillant d’accéder aux informations et données sensibles de votre site.

Pour illustrer ces propos, voici un exemple d’injection SQL simple.

Code PHP:

// Saisie utilisateur SANS injection SQL

 $nomUtilisateur = "jean";           // C'est la saisie utilisateur
 $requeteSQL = "SELECT * FROM clients WHERE nom = '$nomUtilisateur';";
 echo "Normal: "</br>" . $requeteSQL  . "</br>";";


// Saisie utilisateur AVEC injection SQL

$nomUtilisateur = "' OR '1'='1" //Saisie utilisateur
$requeteSQL = "SELECT * FROM clients WHERE nom = '$nomUtilisateur';";
echo "Injection: " . "</br>" . $requeteSQL. "</br>";

Affichage :

Normal:
 SELECT * FROM clients WHERE nom = 'jean';

 Injection:
 SELECT * FROM clients WHERE nom = '' OR '1'='1';

Dans cet exemple, le but de l’instruction SQL normale est de sélectionner toutes les données de la table « clients » pour le client dont le nom d’utilisateur est « jean ».
Le but de l’instruction SQL injectée est par contre de sélectionner chaque entrée unique dans la table « clients ». Ceci n’est, bien sûr, qu’un exemple simple, où l’attaquant récupère des données auxquelles il n’a pas censément accès. Mais attention, il peut faire bien plus de dégâts aux données.

L’injection SQL est une attaque au niveau de la couche applicative, facile à mettre en oeuvre et qui exploite un codage imparfait. Vous ne voulez certainement pas ce genre de faille dans votre travail. La bonne nouvelle est qu’elle peut être évitée. Alors, passons sans plus tarder à la façon dont vous pouvez vous en affranchir.

Comment s’affranchir facilement de l’injection SQL ?

Il existe de nombreuses façons de blinder son code contre les injections SQL. L’une des plus communes et surtout des plus simples est d’utiliser la fonction mysql_real_escape_string. Tous les débutants ne sont pas forcément conscients que cette fonction PHP est spécifiquement faite pour régler les questions d’injection. Cette fonction se saisit simplement d’une chaîne devant être utilisée dans une requête et la retourne en échappant toutes les tentatives d’injection.

Regardons pour l’exemple précédent ce que cela donne.

Code PHP:

// Saisie utilisateur AVEC injection SQL

$nomUtilisateur = "' OR '1'='1"; //Saisie utilisateur
$nomUtilisateur = mysql_real_escape_string( $nomUtilisateur ); // échappement de la saisie utilisateur
$requeteSQL = "SELECT * FROM clients WHERE nom = '$nomUtilisateur ';";
echo "SQL: " . "</br>" . $requeteSQL . "</br>";

Affichage :

SQL:
SELECT * FROM clients WHERE nom = '\' OR \'1\'=\'1';

 

Comme vous pouvez le constater, un backslash (c’est-à-dire la barre oblique inverse) est placé devant chaque guillemet injecté (on dit alors que le guillemet est « échappé »). Cela empêche l’attaque car maintenant la requête SQL lance une recherche sur un nom d’utilisateur inexistant, au lieu de servir le but initialement prévu par l’assaillant.

C’est aussi simple que cela ! Alors, n’hésitez pas à utiliser autant de fois que nécessaire la fonction mysql_real_escape_string afin de rendre votre application sécurisée.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *