Prévenir les attaques XSS avec AngularJS

Tout d'abord, définissons une attaque XSS (Cross-site scripting).

Le cross-site scripting est une faille de sécurité que l'on peut trouver sur les sites web.
Le principe est d'injecter du code côté client (JavaScript) dans une page qui sera vue et dont le code JS sera exécuté par d'autres utilisateurs.

Par exemple, un commentaire de blog pourrait contenir une balise <script>. Si le code HTML du commentaire n'est pas modifié de façon à retirer les balises permettant l'exécution de code, une faille XSS existe. Une telle faille pourrait permettre de voler la session d'un utilisateur en récupérant le cookie d'authentification d'un site.

AngularJS propose par défaut des mécanismes de protection contre les failles XSS.

Par exemple, la directive ngModel n'est pas vulnérable. Les balises <script>, <img> et autres seront modifiées de façon à ne pas être interprétées comme du HTML par le navigateur.

Cependant, il arrive parfois que l'on veuille permettre aux utilisateurs d'ajouter du HTML à un site, par exemple dans un éditeur de texte (WYSIWYG). La directive ngBindHtml permet d'insérer du HTML en évitant les failles XSS. Ainsi, la balise <script> ou l'attribut 'onerror' ne seront pas interprétés, mais la balise <p> sera acceptée. Attention cependant, la balise <img src=> est interprétée comme du HTML. Cela permet donc d'ajouter une image de toute provenance et d'exécuter une requête GET arbitraire. Ce type de faille est appelée CSRF (Cross-site request forgery). Ce genre de requête peut par exemple forcer à se déconnecter d'un site :

<img src="http://mon-site.com/forum/logout.php" />

Cette requête pourrait permettre de propager du spam :

<img src="http://mon-site.com/laisser-un-commentaire.php?action=post&message=spam-url.example.com" />

Voilà pourquoi même en utilisant AngularJS, il faut rester prudent avec l'utilisation de directive traitant des entrées dynamiques.

Laisser un commentaire

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

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.