Protégez vos formulaires du XSS et des injections SQL

closeCet article a été publié il y a 1 an 11 mois 14 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Aujourd’hui plusieurs techniques de hacking existent, deux d’entre elles sont très souvent utilisées, l’injection SQL et le XSS (Cross-site scripting).
Dans cette article nous allons voir comment vérifier si notre site est  sensible à ces deux attaques ou non et surtout voir comment se protéger s’il s’avère que notre site est vulnérable.

Les Injections SQL

Qu’est ce que c’est ?

Une injection SQL est un type d’exploitation d’une faille de sécurité d’une application interagissant avec une base de données, en injectant une requête SQL non prévue par le système et pouvant compromettre sa sécurité.

Comment s’en protéger?

Imaginons que sur notre site nous avons un formulaire de login et que le nom des users et leur mot de passe soient stockés dans une base de données MySQL.

La requête SQL généré par la validation de notre formulaire sera de la forme

SELECT * FROM 'users'
    WHERE 'username' = 'myuser'
    AND 'password' = 'mypassword'

Si notre code n’est pas prévu pour prévenir d’une injection SQL quelqu’un de mal attentionné pourra sans aucune difficulté soumettre via le formulaire du code SQL, il lui sera ainsi possible de modifier la requête SQL généré par le formulaire.
Par exemple soumettre les valeurs suivante via notre formulaire

Nom: ' OR 1=1 /*
Mot de passe: */;--

Modifiera notre requête de la sorte

SELECT * FROM 'users'
    WHERE 'username' = '' OR 1=1 /*
    AND 'password' = '*/;--'

Et là c’est le drame car 1 est toujours égal à 1 nous aurons donc à chaque fois accès au mot de passe.

Afin de rendre impossible l’utilisation de code SQL via notre formulaire le plus simple est d’utiliser la fonction php mysql_real_escape_string qui permet d’échapper notre chaine avant de l’utiliser dans notre requête.
mais cette technique n’est pas infaillible en partie car elle se repose sur le blacklist de certain caractères « dangereux ».
Nous allons donc passer par l’utilisation des requête préparée (ou prepared statements en Anglais) c’est en quelque sorte un template pour nos requêtes qui permet de nous protéger des injections sql sans échapper nos données.
Le code de notre formulaire deviendra alors

<?php
// Créer l'objet mysqli, remplacer les paramètres avec ceux de votre BDD
$db = new mysqli('localhost', 'username', 'password', 'database');
 
// Créer l'objet requête préparée
$stmt = $db->stmt_init();
 
if($stmt->prepare('SELECT * FROM users WHERE \'username\' = ? AND \'password\' = ?')) {
    // Attacher les variables (s pour string, i pour integer etc..)
    $stmt->bind_param('ss', $username, $password);
 
    // Set your variables
    $username = 'toto';
    $password = md5('password');
 
    // Exécuter la requête
    $stmt->execute();
 
    // fermer l'objet requête préparée
    $stmt->close();
}
?>

Pour plus d’informations sur l’utilisation des requêtes préparés vous pouvez vous rendre sur cette article de UltraMegaTech et pour plus de détails sur « bind_param » rendez-vous à cette adresse sur php.net.

Le Cross-site scripting (ou XSS)

Qu’est ce que c’est ?

Le cross-site scripting, abrégé XSS, est un type de faille de sécurité des sites Web qui utilise le javascript, Le principe est d’injecter des données arbitraires dans un site web, par exemple en déposant un message dans un forum, mais aussi par des paramètres d’URL, etc.

Comment vérifier la vulnérabilité de notre site?

Deja pour savoir si notre site est vulnérable c’est très simple il suffit d’utiliser le code suivant soit dans un formulaire soit via une URL

<script type="text/javascript">alert('Site vulnérable')</script>

Si la boite de message « site vulnérable » apparait c’est que votre site permet ce type d’attaques.

Comment s’en protéger?

Pour se protéger de ce type d’attaques le plus simple est d’empêcher l’utilisation des balises html dans nos formulaire en utilisant la fonction htmlspecialchars() qui filtre les ‘<' et '>‘.
la contrainte de cette méthode est que l’utilisateur ne peux plus utiliser du tout les balises html, pour contourner ce problème il est possible d’utiliser une liste blanche de tags html autorisés.

Pour plus de détails sur les techniques disponible pour se protéger des attaques de type XSS vous pouvez consulter cet article de webmaster-talk.

Trackback URL

, , ,

No Comments on "Protégez vos formulaires du XSS et des injections SQL"

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Subscribe to Comments
Get Adobe Flash playerPlugin by wpburn.com wordpress themes