This page is a translated version of the page Cross-site scripting and the translation is 100% complete.

Les Cross-site scripting (XSS) ou encore injection de JavaScript arbitraire sont un type de faille de sécurité des ordinateurs que l’on trouve typiquement dans les applications web qui permettent aux attaquants d’injecter des scripts côté client dans les pages web visitées par les autres utilisateurs.

Pour plus d’informations concernant les XSS côté client et comment les empêcher, consultez XSS basé sur le DOM .

Exemples

Exemples de XSS :

  • Un attaquant conduit un utilisateur authentifié à visiter une URL artisanale spécifique, ou un site web qu'il contrôle et qui peut le rediriger vers cette URL artisanale.
  • L'URL pointe sur votre application web et inclut du code JavaScript dans la chaîne de la requête. L'application web, à cause de l'échappement insuffisant, injecte le code JavaScript arbitraire dans la page affichée à l'utilisateur.
  • Le JavaScript s'exécute ayant un accès complet aux cookies de l'utilisateur. Il peut modifier la page comme il veut, et soumettre des formulaires à l'insu de l'utilisateur. Le risque est particulièrement important si la victime est un administrateur avec des droits spécifiques.

Voir aussi les exemples d’exploitation sur Wikipédia en anglais.

Exemple :

function getTableCell( $out, $value ) {
    $request = $out->getRequest();
    $class = $request->getVal( 'class' );
    return "<td class='$class'>" . htmlspecialchars( $value ) . '</td>';
}

L'attaquant envoie la victime sur une URL telle que :

http://example.com/wiki/SomePage?class='%20><script>hack();</script></td><td%20class='

Les requêtes POST sont aussi vulnérables en utilisant du JavaScript hors site.

Les victimes n'ont même pas à visiter directement la page pour être atteints. Certains sites web tiers vicieux incluent des iframes cachées vers les URL artisanales pour attaquer un utilisateur qui visite un de leurs sites. Ils peuvent tout aussi bien être incités à visiter une URL malicieuse ou artisanale en utilisant les services des URLS courtes ou en maquillant l'URL en une autre.

Arrêter les XSS

Pour empêcher le XSS suivez ces indications :

  • Validez vos entrées
  • Echappez vos sorties

Vous pouvez sauter la validation mais jamais l'échappement. Echappez tout.

Ce n'est pas gênant que l'échappement soit redondant avec la validation, le coût en perte de performance est minime par rapport à la sécurité démontrable apportée à une application web. Il n'est pas important que les entrées proviennent d'une source de confiance, l'échappement est même nécessaire car il vous apporte normalisation et sécurité.

Echappez aussi près que possible de la sortie de sorte à ce que le relecteur puisse vérifier facilement que cela a été fait. Cela vous aide à vérifier également votre propre code également.

L'encodage des sorties est fonction du contexte. Soyez donc conscient du contexte de sortie prévu et encodez de manière appropriée (par exemple l'entité HTML, l'URL, le JavaScript, etc.)

La page OWASP Abridged XSS Prevention Cheat Sheet est un guide de référence rapide utile et à jour pour traiter les problèmes XSS.

Tout ceci est valide avec n'importe quel format d'échange basé sur du texte. Nous nous sommes focalisés sur HTML car les applications web en génèrent beaucoup et que les problèmes de sécurité y sont particulièrement importants. Tous format texte doit avoir une fonction d'échappement suffisamment étudiée.

Voici quelques fonctions pratiques qui réalisent l'échappement du HTML pour votre site.

Format Fonction d'échappement Remarque
HTML htmlspecialchars( $string, ENT_QUOTES ) Utilisez toujours le drapeau ENT_QUOTES qui convertit à la fois les guillements et les apostrophes simples. Malheureusement PHP par défaut ne fait que l'échappement des apostrophes simples.[1]
ID XML Sanitizer::escapeId() Pour les attributs de ID en HTML
Style Sanitizer::checkCss() Pour les attributs de style dans HTML
JavaScript FormatJson::encode(), Xml::encodeJsVar()
Paramètres de l'URL wfArrayToCgi(), urlencode()
SQL $db->addQuotes()

Sortie échappée de MediaWiki

MediaWiki possède également des interfaces intégrés élégants qui échappent implicitement vos sorties. En SQL l'utilisation de la syntaxe 'clé' => 'valeur' des conditions réalise automatiquement l'échappement des valeurs. Les méthodes des interfaces Html:: et Xml:: échappent les attributs, et en fonction de la méthode utilisée elles peuvent aussi échapper une valeur textuelle.

Liens externes

  • Echappement, w3.org. Définition de l'échappement très bien rédigée.

Références