2009-01-24 8 views
9

¿Alguien sabe si un DOM Node de tipo Text garantiza que el navegador no lo interpretará como HTML?¿Se garantiza que un nodo de texto DOM no se interpretará como HTML?

Más detalles seguir.

Antecedentes

Estoy construyendo un sencillo sistema de comentarios web para un amigo, y he estado pensando acerca de los ataques XSS. No creo que filtrar o escapar de las etiquetas HTML sea una solución muy elegante; es muy fácil crear una convolución que se salga del filtro. El problema fundamental es que quiero garantizar que, para ciertos elementos de contenido (es decir, el contenido que los usuarios web no autenticados POST), el navegador nunca intente interpretar o ejecutar el contenido.

Una llanura (texto) iniciar

El primer pensamiento que vino a la mente es sólo para usar Content-Type: text/plain, pero esto tiene que aplicarse a toda una página. Puede poner un texto simple IFRAME en el medio de una página, pero es feo y crea problemas de foco si el usuario hace clic en el marco.

innerText/textContent/jQuery

Resulta que hay algunos navegador específico (innerText en IE, textContent en FF, Safari, etc.) los atributos que, cuando se establece, están obligados a crear una solo nodo Text.

jQuery trata de evitar la diferencia de atributos específicos del navegador, mediante la implementación de una sola función text(val) que se salta los atributos específicos del navegador y va directamente a document.createTextNode(text), que, como se puede adivinar, crea un nodo Text.

W3 DOM TextNode s

Así que creo que está cerca de lo que quiero, lo que parece good-- Text nodos no pueden tener hijos, y parece como que no pueden ser interpretados como HTML. Pero no estoy 100% seguro de los documentos oficiales.

La parte de textContent es particularmente alentador, porque dice "sobre la configuración, sin análisis se realiza o bien, la cadena de entrada se toma como contenido de texto puro ". Pero, ¿es esto fundamental para todos los nodos Text, o solo para los nodos en los que establece textContent? Esto probablemente parezca una objeción tonta, pero podría ser importante porque IE no es compatible con textContent (ver arriba).

de nuevo a la pregunta inicial

Alguien puede confirmar/rechazar que esto funcionará? Es decir, que un navegador compatible con w3 DOM va a nunca interpretar un nodo Text como HTML, sin importar el contenido? Estaría muy agradecido de tener esta atormentada y pequeña incertidumbre resuelta.

¡Gracias por su tiempo!

Respuesta

5

Sí, esto se confirma, en la medida en que para el navegador que no fue, ese navegador tendría un grave defecto. Un nodo de texto que representa cualquier cosa menos texto sería una contradicción. Mediante el uso de document.createTextNode ("some string"); y al agregar ese nodo, la cadena es garantizada para que se represente como texto.

0

No creo que la filtración o escape de etiquetas HTML es una solución muy elegante - que es demasiado fácil para llegar a una convolución que se deslice más allá del filtro

Eso es absolutamente falso, filtrando > a & gt; y < a & lt; detendrá por completo cualquier inyección HTML.

+2

Estoy basando mi paranoia por: http://stackoverflow.com/questions/53728/will-html-encoding-prevent-all-kinds-of-xss-attacks http: // blog. stackoverflow.com/2008/06/safe-html-and-xss/ – elliot42

+2

@surprise_ wrong. hay muchas otras técnicas de inyección, desde trucos de codificación hasta inyección de atributos, JavaScript, CSS, etc. – Zach

Cuestiones relacionadas