Cours de sécurité accéléré no. 3 - XSS

Cet article a été écrit par Damien Metzger, et publié sur le blog de PrestaShop le 26 septembre 2011.

Ce serait une erreur de croire qu'il faut un accès au code d'un site Internet pour le pirater. En effet, même au niveau de l'affichage HTML, il est nécessaire de bien protéger toutes les données qui apparaissent.

Une faille XSS consiste à exploiter l'interprétation HTML / JavaScript par le navigateur lors l'affichage des données. Si vous affichez dans la page une donnée non protégée – c'est-à-dire sans prendre le soin de convertir les caractères qui sont interprétés-, alors le navigateur pourra interpréter les variables affichées comme du HTML ou du JavaScript.

Page :
<html> <body> Aucun résultat n'a été trouvé pour votre mot clé $keyword.</body> </html>

Exploitation :

Il suffit d'indiquer comme mot clé la chaine de caractères suivante :

<script type="text/javascript">alert('kikoo');</script>

Résultat :

Un message d'alerte « kikoo » apparaitra sur la page.

On peut bien évidemment faire bien plus en JavaScript qu'un message d'alerte : redirection vers un autre site, vol de cookies...

Comment s'en protéger ?

Ce n'est pas très compliqué : tout ce qui apparaît dans vos pages HTML doit être protégé avec une fonction comme htmlspecialchars() ou htmlentities(). Selon les cas, vous pourrez également être amené à utiliser des fonctions complémentaires telles que strip_tags() qui enlève toutes les balises HTML d'une chaine de caractères, ou encore un simple addslashes() si vous faites du JavaScript.

La vraie difficulté n'est donc pas de se protéger, mais plutôt de ne pas en oublier. Les raisons principales d'un oubli sont :

Bref : aucune donnée ne doit être épargnée, car il n'y a pas de donnée complètement fiable.