Es jQuery.método text () XSS ¿seguro?


Tengo datos no registrados de los usuarios.

Así que es seguro usar así:

var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
    $('body').text(data);

¿Puedo usar esto o hay algunos problemas como la codificación o algunos símbolos específicos que debo tener cuidado y agregar una validación más estricta?

Author: Vytautas, 2012-03-16

6 answers

Cuando se establece el texto de un elemento utilizando el método text, jQuery utiliza createTextNode internamente, que escapa a todos los caracteres especiales.

Desde jQuery docs :

Tenemos que ser conscientes de que este método escapa a la cadena proporcionada como necesario para que se renderice correctamente en HTML. Para ello, llama a el método DOM .createTextNode(), que reemplaza caracteres especiales con sus equivalentes de entidad HTML (como &lt; para <)

Así que sí, debería ser seguro. Aquí está su ejemplo en jsfiddle. Observe cómo las etiquetas aparecen como texto literal.

 53
Author: James Allardice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-16 09:57:43

Porque los ataques XSS dependen de poder insertar nodos DOM(<img />, <script />) etc, y jQuery.fn.text() no admite esto, es completamente seguro para XSS.

Como se puede ver en este ejemplo básico , todas las etiquetas HTML se codifican como resultado de jQuery usando createTextNode internamente:

jQuery('div').text('<test>a&f"#</test>');​

De modo que lo que es realmente insertado es más equivilant a;

jQuery('div').html('&lt;test&gt;a&f"#&lt;/test&gt;');​
 14
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-16 09:57:21

Todavía tiene que tener cuidado al insertar el resultado en el DOM - ver: Vulnerabilidad Cross-Site Scripting con JavaScript y jQuery.

Para configurar el texto de los elementos, sin embargo, el texto debe ser seguro XSS.

 8
Author: Matthias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-13 07:42:10

El autor de http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods / argumenta en contra de usar createTextNode o .text() de jQuery.

...si conoce el contexto en el que está inyectando el valor (es decir, no atributos), este método es seguro. Mi argumento es que los desarrolladores no entienden esos contextos lo suficientemente bien, y tarde o temprano se equivocarán.

Es mejor usar el reemplazo de cadenas (de al menos <).

Algunos ejemplos de bibliotecas bien protegidas:

La sugerencia #1 de OWASP es:

REGLA #1-Escape HTML Antes de Insertar Datos No Confiables en el Contenido del Elemento HTML

 1
Author: Luke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-14 20:03:32

A diferencia de la .html() método .text() se puede utilizar tanto en XML como en HTML documento. El resultado de la .el método text() es una cadena que contiene texto combinado de todos los elementos coincidentes. (Debido a variaciones en el HTML analizadores en diferentes navegadores, el texto devuelto puede variar en nuevas líneas y otro espacio en blanco.)

.text(data) quitaría el <test></test> y te dejaría con a&f#

 0
Author: mas-designs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-16 09:56:50

Sí. Se trata de texto, no de código.

 -1
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-16 09:56:33