Sécurité : Protection faille XSS

Dans un ancien article je vous conseillais d’utiliser des jetons pour vous protéger de la faille CSRF. Cette faille permettait à l’attaquant de d’utiliser vos droits d’administrateur pour faire n’importe quelle action sur votre site. Nous avons bouché la faille.

Cependant le cerveau humain, et plus particulièrement celui des pirates, est très mesquin et ne manque pas d’imagination pour remplir des formulaires en essayant des valeurs exotiques. Par exemple il pourrait tenter d’injecter du code Javascript ou HTML en utilisant la faille XSS.

Initialement appelée CSS (Crossing Site Scripting) cette faille s’appelle finalement XSS pour ne pas la confondre avec les feuilles de style.

Attention, je vous entends déjà dire que, vu que ce langage s’exécute du côté client d’une application, tout code Javascript ne représente pas réellement une faille de sécurité. Détrompez-vous, les injections Javascript sont à la base du vol de session. Oui, le Javascript permet de lire les cookies du visiteurs et donne donc la possibilité de les envoyer à un autre serveur (celui d’un pirate par exemple).

Principe de l’attaque

L’attaque est très simple à mettre en place si aucune défense n’a été mise en place.

Prenons par exemple un forum développé par un débutant en PHP qui n’aurait pas installé de protections spéciales pour ce genre d’attaques. Il vous propose donc un formulaire pour répondre aux différents messages. Vous validez le formulaire qui s’envoie au serveur. Ce dernier le traite contre les injections SQL (oui, il est débutant mais il a déjà lu mes articles) puis enregistre votre réponse dans la base de données.

Imaginons que vous aillez mis du code HTML dans votre réponse. Je ne parle pas de balises b, u, i ou autres mises en forme mais de balises plus perfides, plus puissantes : script. Lorsqu’un visiteur viendra voir votre réponse, le HTML que vous avez ajouté se mêlera avec celui du forum et ainsi votre code Javascript s’exécutera.

Comment se protéger de la faille XSS

Je ne me lasserai jamais de répéter à tous ceux qui me demande des conseils de sécurité que la base de la base c’est de partir du principe que tout ce qui vient du visiteur (ou de son navigateur) est pirate et qu’il faut donc se protéger.

Retournons à nos moutons, protégeons-nous des injections XSS. Le principe de protection aujourd’hui est de garder en tête que PHP, par exemple, est une plateforme qui communique avec d’autres systèmes : bases de données, mails, fichiers, PDF, et la liste est très longue. A chaque fois que PHP devra envoyer des informations à un de ces systèmes, il faudra utiliser les protections adéquates. Par exemple, basename($file_path) pour communiquer avec le système de fichiers ou la préparation de requêtes pour le SQL.

Cependant aujourd’hui le système qui nous intéresse est le HTML et la fonction à utiliser est htmlentities($text). Cette fonction remplace les caractères gênants (« <« , « > », »& », etc.) ainsi que les accents par leurs code HTML. Par exemple « > » sera remplacé par « &gt; » et « â » sera remplacé par « &acirc; ».

Pour conclure, à la place de :

echo $ligne_de_la_bdd['message'];

Vous écrirez :

echo htmlentities($ligne_de_la_bdd['message']);

PHP et UTF-8

Si vous avez l’habitude de travailler en UTF-8, et c’est une très bonne idée, vous vous êtes sûrement déjà rendu compte que htmlentities($text) ne fourni pas le résultat souhaité.

Utilisez cette fonction de la façon suivante :

htmlentities($text, ENT_COMPAT, 'UTF-8');
// ou
htmlentities($text, ENT_QUOTES, 'UTF-8');
Tagués avec : , , , , , , , , , , ,
Publié dans Sécurité
3 commentaires pour “Sécurité : Protection faille XSS
  1. rr dit :

    alert(‘Warning’)

  2. Olivier PEREZ dit :

    Bonjour à tous et particulièrement au rédacteur du commentaire précédent.
    Je trouve ça très bien que tu testes la faille décrite dans cet article. Mais j’apprécierai que tu fasses tes tests sur un serveur à toi.

    Dans tous les cas. Je suis content que tu ais fait le test, ça m’a permis de me rendre compte que tout marche bien.

  3. erzer dit :

    Merci ! :)

Laisser un commentaire

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

*