html () vs innerHTML jquery / javascript & XSS attaques

Je teste des attaques xss sur mon propre code. L’exemple ci-dessous est une simple boîte où un utilisateur peut taper ce qu’il veut. Après avoir appuyé sur “test!” JS affichera la chaîne d’entrée en deux divs.C’est un exemple que j’ai fait pour mieux expliquer ma question

   function testIt(){ var input = document.getElementById('input-test').value; var testHtml = document.getElementById('test-html'); var testInnerHTML = document.getElementById('test-innerHTML'); $(testHtml).html(input); testInnerHTML.innerHTML = input; }  this is a test    

si vous essayez de le copier dans un fichier .html et que vous l’exécutez, tout se passera bien, mais si vous essayez de saisir alert('xss') , un seul alert('xss') alerte sera lancé: celui-ci dans `test-html ‘div (avec la fonction html ()).

Je ne comprends vraiment pas pourquoi cela se produit, et aussi, inspecter le code avec firebug me donne ce résultat (après avoir injecté le script)

  this is a test   
alert('xss')

comme vous pouvez le constater, test-html div est vide et test-innerhtml div contient le script. Quelqu’un peut me dire pourquoi? Est-ce parce que html () est plus sécurisé contre l’injection de scripts ou quelque chose de similaire?

Merci d’avance Cordialement.

JQuery supprime les balises de script, raison pour laquelle vous ne la voyez pas s’append au dom, et encore moins à son exécution.

Pour voir une explication de la raison pour laquelle jquery la supprime, vous pouvez voir la réponse de John Resig ici: https://forum.jquery.com/topic/jquery-dommanip-script-tag-will-be-removed

J’espère que cela t’aides

Contrairement à ce qui est dit sur cette page, jQuery.html() et les nombreuses fonctions jQuery qui acceptent les chaînes HTML en tant qu’arguments sont plus sujets à l’injection XSS basée sur DOM que innerHTML , comme l’a remarqué le PO.

jQuery.html() extrait les balises , met à jour le DOM et évalue le code incorporé dans les balises de script .

En conséquence, XSS peut se produire sans interaction de l'utilisateur même après le chargement du DOM lors de l'utilisation de jQuery.html() .

C'est très facile à démontrer.

Cela appellera alert() :

 $('.xss').html(' 

http://jsfiddle.net/2TpHC/

Alors que cela ne va pas:

 var d = document.getElementById('xss'); d.innerHTML = 'alert("XSS");'; 

http://jsfiddle.net/Tjspu/

Malheureusement, de nombreux autres chemins de code (puits) conduisent à l'appel de eval() dans jQuery. Les personnes conscientes de la sécurité éviteront probablement jQuery complètement, autant que possible.

Notez que je ne prétends pas que l’utilisation de innerHTML soit une défense efficace contre XSS. Ce n'est pas. Le transfert de données non échappées vers innerHTML n'est pas sûr, comme l'a souligné @daghan. Il faut toujours échapper correctement les données lors de la génération de HTML.

oui jquery html ne rendra pas les balises de script

mais ce n’est pas plus sûr car vous pouvez utiliser de nombreuses autres charges xss telles que le style, les expressions, etc.

Ceci est similaire à la fois à cette question et à celle-ci . .html() supprime les balises de script avant de saisir le code HTML et de les exécuter séparément.

Pour ce qui est de la raison pour laquelle le second n’est pas exécuté, c’est que des scripts ajoutés de manière dynamic ne seront pas exécutés une fois la page chargée.

Mais, comme @Ben le fait remarquer, il y a beaucoup d’ouvertures XSS pour accepter de telles choses. Cela dit, si les informations sont affichées sur leur propre page, ils peuvent exécuter le code de leur choix sur leur propre ordinateur. Le gros problème sera que vous stockiez ceci ou l’envoyiez à d’autres utilisateurs. À moins que vous ne le fassiez, il n’y a pas de protection des utilisateurs contre eux-mêmes à cet égard. Peut-être que savoir contre quoi vous essayez de vous protéger aidera.