¿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 Text
Node
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.
- interfaz
Node
: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247 - interfaz
Text
: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1312295772 textContent
: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent
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!
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
@surprise_ wrong. hay muchas otras técnicas de inyección, desde trucos de codificación hasta inyección de atributos, JavaScript, CSS, etc. – Zach