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.
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 « > » et « â » sera remplacé par « â ».
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');







octobre 21st, 2010 on 18h22
alert(‘Warning’)
octobre 22nd, 2010 on 19h11
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.