¿Puedo simplemente buscar-reemplazar y?

9

Estoy ejecutando un sistema de comentarios y quiero aceptar texto regular sin formato.

No quiero nada demasiado complicado, por lo que pensé en buscar y reemplazar todo el espacio < (a través de expresiones regulares o un simple bucle for ), por lo que <script src="http://malicioussite.com">apareceríacomoscriptsrc="http://malicioussite.com" .

¿Hay alguna razón no para hacer esto?

¿Puede un pirata informático seguir saliendo con un XSS?

    
pregunta xss 15.01.2016 - 09:25
fuente

3 respuestas

25

Reemplazar los caracteres < y > no es suficiente en todos los casos. Claro, evitará que cualquier usuario abra una etiqueta HTML, pero eso no impedirá que él / ella inyecte atributos HTML en una etiqueta HTML.

Por ejemplo, tomemos un analizador que transforme [img=XXX] en <img src="XXX" /> , reemplazando solo < y > .

Un usuario malintencionado podría ingresar [img=X" onerror="alert(1)] y el analizador volvería:

<img src="X" onerror="alert(1)" />

Y la alerta se activará, lo que significa que es posible un ataque XSS.

    
respondido por el Benoit Esnard 15.01.2016 - 09:42
fuente
21

Puede ser suficiente, y puede que no lo sea, pero definitivamente no es una buena idea.

  

¿Puede un pirata informático seguir saliendo con un XSS?

Posiblemente, dependiendo de la situación.

@BenoitEsnard ya describió una situación en la que filtrar < y > no es suficiente: cuando la entrada del usuario se repite dentro de los atributos de las etiquetas HTML existentes, porque entonces un atacante podría agregar nuevos atributos.

Aquí hay una lista con diferentes contextos y cómo manejarlos cuando evitando XSS .

  

¿Hay alguna razón para no hacer esto?

Sí.

Supongamos que realmente solo haces eco del comentario dentro de <textarea>COMMENT</textarea> al editar un comentario, y dentro de <div id=comment>COMMENT</div> cuando se muestra un comentario, en ninguna otra parte, y no quieres ningún formato HTML, solo el texto simple tu dijiste.

Si escribes tu función correctamente, sería seguro. Pero no sería muy fácil de usar. Dependiendo del tipo de sitio web que tenga, los usuarios querrían usar < y > en muchas situaciones, por ejemplo: Love you <3 , 2 < 3 , use this: this->exec() , <font> is deprecated , >.< , ...

Por lo tanto, definitivamente es un problema de usabilidad y posiblemente un problema de seguridad según el contexto y la corrección de la implementación .

Simplemente use las funciones que se usan comúnmente en lugar de escribir su propio mecanismo (por ejemplo, en PHP use htmlentities cuando haga eco de las entradas de un usuario en un HTML contexto en el que no desea analizar el HTML dado, use alguna biblioteca como HTMLPurifier si necesita HTML, y así sucesivamente)

    
respondido por el tim 15.01.2016 - 13:49
fuente
0

No, no es suficiente: si solo inserta a ciegas el texto enviado por el usuario en su salida HTML, hay muchos contextos diferentes donde otros símbolos pueden tratarse como parte del marcado. La forma más segura y, posiblemente, correcta es tratar explícitamente el texto sin formato como, bueno, texto sin formato. Recupere este texto con una solicitud separada basada en JavaScript de su servidor, ya sea solo un fragmento de texto o empaquetado en JSON, y asigne directamente a la propiedad data del nodo de texto en DOM. De esta manera, garantiza que nunca se procesará como algo más que un simple texto sin impedir la capacidad del usuario de usar los símbolos que desee.

// Obtain user somehow generated text. For this demonstration I'll just inline it.
var text = "some <funky> &text& with something that looks like </script> suspicious HTML"
// Find target text node in your page. For this demonstration I'll just create it myself.
var text_node = document.createTextNode('')
document.body.appendChild(text_node)

// Now just assign your text data to node
text_node.data = text
    
respondido por el Oleg V. Volkov 16.01.2016 - 06:19
fuente

Lea otras preguntas en las etiquetas