2012-03-16 16 views
55

Tengo datos no guardados de los usuarios.¿Es seguro el método jQuery .text() XSS?

Por lo que es seguro de usar como esto:

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

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

+2

Aunque jQuery escapa de manera efectiva de los elementos HTML cuando se utiliza '.text (data)', se puede decir algo por no tener completamente oculto el código HTML definido por el usuario en su base de datos. No deberías tener que confiar en tu memoria para usar el HTML del lado del cliente que se escapa cada vez que usas esa variable de base de datos y tampoco nadie debería usar tu código. Así que yo diría, quite las etiquetas html de los datos antes de guardarlos en su base de datos. Realice algunas pruebas que garanticen que solo pueda guardar datos eliminados en html para campos definidos por el usuario. Realmente no veo el valor de escapar vs. pelar en este caso. –

+0

Si el usuario quiere enviar html no quiero decirle lo siento hermano que no puede. Tal vez eso no es html, ¿cómo debería saber? ¿Qué pasa con el ahorro en la base de datos no desinfectada? ¿Por qué debería eliminar algunas partes o modificar los datos del usuario? Si lo hago, ¿cómo el usuario podrá obtener sus datos exactamente? – Vytautas

+0

No se trata de negarse a almacenar datos peligrosos, se trata de hacer que los datos peligrosos sean seguros de almacenar y usar. No muchas personas intentarán usar HTML legítimamente y quienes lo hagan verán que su HTML se elimina lo suficientemente pronto. Pelar las etiquetas html alrededor del texto aún dejará el texto dentro de ellas. Realmente tiene que modificar los datos del usuario si esos datos pueden ser peligrosos para usted y los demás. No lo deje en su base de datos para ser utilizado accidentalmente. –

Respuesta

50

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 el jQuery docs:

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

Así que sí, debe ser seguro. Aquí está your example in jsfiddle. Observe cómo las etiquetas aparecen como texto literal.

+0

Tenga en cuenta que esta función también al revés, por lo que invocarlo a los datos ya escapados dará como resultado t en el que no está protegido, lo que puede dar como resultado inadvertidamente un XSS - P. ej. http://jsfiddle.net/7ykbosas/1/ –

-1

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

0

A diferencia del método .html(), .text() se puede utilizar en documentos XML y HTML . El resultado del método .text() es una cadena que contiene el texto combinado de todos los elementos coincidentes. (Debido a las variaciones en el código HTML analizadores en diferentes navegadores, el texto devuelto puede variar en nuevas líneas y otros espacios en blanco.)

.text(data) sería despojar a la <test></test> de distancia y te dejan con a&f#

+2

texto que no elimina nada simplemente escapando, por lo que el resultado sería' <prueba> a & f "# </prueba >' – Vytautas

+0

¿Tiene alguna prueba? ? Porque he usado .text() muchas muchas veces y siempre funcionó para mí. –

+0

comprobar respuestas aceptadas violín ejemplo – Vytautas

7

Todavía hay que tener cuidado al insertar el resultado en el DOM - ver: Cross-Site Scripting vulnerability with JavaScript and JQuery.

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

+2

+1 Esto es bastante importante ya menudo pasado por alto. Para resumir: 'JQuery text() devuelve una carga no guardada que puede dar como resultado la ejecución de un script malicioso si se transfiere a los métodos .after() o append() etc.' – Medorator

13

Dado que los ataques XSS se basan en poder insertar nodos DOM (<img />, <script />) etc., y jQuery.fn.text() no es compatible con esto, es completamente seguro para XSS.

etiquetas Como se puede ver en este basic example, todos los aspirantes a-HTML se codifican como resultado de jQuery usando createTextNode internamente:

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

Así que lo que es realidad introducido es más equivilant a;

jQuery('div').html('&lt;test&gt;a&f"#&lt;/test&gt;');​ 
1

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

...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 comprenden esos contextos lo suficientemente bien, y tarde o temprano lo entenderán mal.

Es mejor utilizar el reemplazo de cadena (de al menos <).

Algunos ejemplos de bibliotecas bien asegurada:

El #1 OWASP suggestion es:

REGLA # 1 - HTML escapar antes de Inserción que no se confía Datos en HTML Element Content