Ne sortez jamais aucun bit de données dans le flux HTML qui n'a pas été passé par htmlspecialchars()
et tu as fini. Règle simple, facile à suivre, élimine complètement tout risque XSS.
En tant que programmeur, c'est votre travail pour le faire, cependant.
Vous pouvez définir
function h(s) { return htmlspecialchars(s); }
si htmlspecialchars()
est trop long pour écrire 100 fois par fichier PHP. D'autre part, en utilisant htmlentities()
n'est pas du tout nécessaire.
Le point clé est le suivant :il y a du code et il y a des données. Si vous mélangez les deux, de mauvaises choses s'ensuivent.
Dans le cas du HTML, le code est constitué d'éléments, de noms d'attributs, d'entités, de commentaires. Les données sont tout le reste. Les données doivent être échappé pour éviter d'être confondu avec du code.
Dans le cas des URL, le code est le schéma, le nom d'hôte, le chemin, le mécanisme de la chaîne de requête (?
, &
, =
, #
). Les données sont tout ce qui se trouve dans la chaîne de requête :noms et valeurs des paramètres. Ils doivent être échappé pour éviter d'être confondu avec du code.
Les URL intégrées au HTML doivent être doublement échappé (en échappant l'URL et HTML-échappant) pour assurer une bonne séparation du code et des données.
Les navigateurs modernes sont capables d'analyser un balisage étonnamment cassé et incorrect en quelque chose d'utile. Cette capacité ne doit cependant pas être soulignée. Le fait que quelque chose fonctionne (comme les URL dans <a href>
sans échappement HTML approprié appliqué) ne signifie pas qu'il est bon ou correct de le faire. XSS est un problème qui prend racine chez a) les personnes ignorant la séparation des données/codes (c'est-à-dire "s'échappant") ou celles qui sont bâclées et b) les personnes qui essaient d'être intelligentes sur la partie des données qu'elles n'ont pas besoin d'échapper.
XSS est assez facile à éviter si vous vous assurez de ne pas tomber dans les catégories a) et b).