L'une des classes de vulnérabilité les plus courantes dans les sites Web est appelée « Cross-Site Scripting » ou « XSS ». Les vulnérabilités XSS sont là où il est possible pour un utilisateur de provoquer l'exécution de JavaScript. Il existe un certain nombre de variantes différentes de la vulnérabilité XSS, avec des degrés de gravité variables.
Le problème avec un attaquant pouvant exécuter JavaScript dans les sessions d'autres utilisateurs est qu'il est alors possible pour l'attaquant de faire n'importe quoi sur le site Web que les victimes voient. Cela inclut la redirection des victimes vers des sites Web externes, le vol de jetons d'authentification et la surveillance des détails de paiement.
La forme la plus grave de vulnérabilité XSS est le Cross-Site Scripting « Stored » ou « Persistent ». Avec un exploit XSS enregistré dans la base de données, il est alors possible qu'il affecte d'autres utilisateurs sur une longue période.
Une autre forme de Cross-Site Scripting est "Reflected", ce type n'est enregistré à aucun moment, à la place, la charge utile est incluse dans le navigateur. En règle générale, ce type de XSS fait partie des attaques de phishing, où un attaquant tente de tromper une victime pour qu'elle clique sur un lien malveillant.
En règle générale, la plupart des attaques XSS envoient la charge utile au serveur à un moment donné, mais certaines attaques sont purement côté client, n'étant jamais envoyées au serveur et affectant uniquement JavaScript côté client. C'est ce qu'on appelle le XSS basé sur DOM car il reste dans le modèle d'objet de document JavaScript, ou DOM. Ce type de vulnérabilité est particulièrement difficile à identifier et à résoudre car les exploits ne sont jamais vus par le serveur et ne peuvent donc pas être enregistrés.
Historiquement, la technique de prévention contre les vulnérabilités XSS consiste à filtrer toutes les données soumises par les utilisateurs, en utilisant des listes de blocage pour rejeter tout message contenant des caractères ou des mots significatifs en JavaScript. Cela a eu tendance à conduire à une course aux armements pour trouver des contournements pour le filtre tout en empêchant également certaines soumissions d'utilisateurs légitimes. La bonne solution consiste à utiliser des entités HTML pour coder les données soumises par l'utilisateur. avec les modules d'entités HTML activés, les caractères sont automatiquement codés dans un format où le navigateur sait les afficher comme les symboles corrects mais pas les traiter comme du code.