2011-11-29 38 views
8

Estoy probando ataques xss en mi propio código. El siguiente ejemplo es una simple caja donde un usuario puede escribir lo que quiera. Después de presionar "¡prueba!" botón, JS mostrará la cadena de entrada en dos divs.This es un ejemplo que hice para explicar mejor mi pregunta:html() vs innerHTML jquery/javascript & XSS attack

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript"> 
    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; 
    } 
</script> 
<head>this is a test</head> 
<body> 
    <input id="input-test" type="text" name="foo" /> 
    <input type="button" onClick="testIt();" value="test!"/> 
    <div id="test-html"> 
    </div> 
    <div id="test-innerHTML"> 
    </div> 
</body> 

si se intenta copiar en un archivo .html y ejecutarlo, funcionará bien, pero si intenta ingresar <script>alert('xss')</script>, solo se lanzará un cuadro de alerta: el que está dentro de `test-html 'div (con la función html()).

Realmente no puedo entender por qué esto está ocurriendo, y también, inspeccionando el código con Firebug me da este resultado (después de la inyección de la secuencia de comandos)

<body> 
this is a test 
<input id="input-test" type="text" name="foo"> 
<input type="button" value="test!" onclick="testIt();"> 
<div id="test-html"> </div> 
<div id="test-innerHTML"> 
    <script> 
    alert('xss') 
    </script> 
</div> 
</body> 

como se puede ver test-html div está vacía, y test-innerhtml div contans el script. ¿Puede alguien decirme por qué? ¿Es porque html() es más seguro contra la inyección de scripts o algo similar?

Gracias de antemano, saludos cordiales.

+2

Usted no tiene que preocuparse por la seguridad cuando el usuario escribe , porque cualquier script que intenten insertar solo será af fect ellos en ese punto. Lo que sí debe preocuparse es qué sucede cuando el texto ingresado se envía a su servidor web; si lo está almacenando en una base de datos, debe asegurarse de no conquistar ciegamente el texto ingresado al final de un SQL. consulta. Si luego devuelve texto previamente ingresado, debe asegurarse de que el valor ingresado sea escapado para que, por ejemplo, "

0

sí jQuery HTML no rinde etiquetas script

pero no es más seguro porque se puede utilizar muchas otras cargas útiles tales como XSS <a href> estilo, expresión, etc ..

+0

* Es * más seguro, simplemente no * completamente * seguro y no se debe confiar en él. – Mario

+0

Sí, supongo que es cierto, pero seguro no es la palabra, solo aceptamos que es menos vulnerable que innerHTML. – Ben

+0

En realidad, ** lo que hace jQuery es más propenso a la explotación ** porque lo primero que hace jQuery cuando encuentra las etiquetas '