Herramientas de desarrollo · Escapador de entidades HTML
Decodificación de entidades HTML sin internalHTML: cómo funciona un decodificador de tabla de búsqueda
· Cómo funciona
HTML seguridad codificación
El popular truco de decodificar entidades asignándolas a internalHTML ejecuta su entrada a través del analizador HTML, que es exactamente lo que no desea. Esta publicación explica el enfoque basado en tablas más seguro y cómo maneja las referencias con nombre, decimales y hexadecimales.
El decodificador que ejecutó un <img onerror>: un caso concreto en el que 'simplemente decodificarlo' se convirtió en ejecución de script
La entrada común element.innerHTML = hace más que decodificar &. Si la entrada también contiene <img src=x onerror=...>, el navegador crea un elemento de imagen y un atributo de controlador de eventos. Dependiendo de cómo se conecte y cargue ese nodo, esto puede convertir un acceso directo de formato en una ejecución de script. Una cadena similar a HTML pegada debe seguir siendo datos cuando el único trabajo es resolver referencias de caracteres, no analizarse en un árbol DOM.
Qué hace realmente InnerHTML con una cadena: análisis, creación de elementos y atributos del controlador de eventos, no solo reemplazo de entidades
InnerHTML invoca el analizador HTML: las etiquetas se convierten en nodos, los atributos adquieren significado en el navegador y una lectura posterior de textContent elimina el marcado del resultado. Una etiqueta <strong> que pretendía conservar como entrada literal puede desaparecer como formato de texto. Un elemento desprendido no es una garantía de seguridad general; el código a menudo reinserta ese subárbol o usa el HTML resultante en otro lugar. Si necesita mostrar entradas que no son de confianza, asigne textContent y desinfecte solo cuando elija deliberadamente representar HTML.
El enfoque de la tabla de búsqueda (una expresión regular para &name;, &#NNN; y &#xHHH;, y un mapa de nombres a personajes
El decodificador de ToolAcre utiliza una expresión regular limitada para encontrar una referencia de la forma &name;, { o {. Las referencias nombradas se buscan en una práctica tabla explícita, que incluye amp, lt, gt, comillas y tipografía común. Un nombre desconocido se deja escrito en lugar de adivinarse. Este enfoque no crea elementos ni llama a ningún analizador HTML; simplemente reemplaza subcadenas reconocidas en una cadena. La tabla es deliberadamente un subconjunto, no todas las referencias de caracteres con nombre HTML.
Manejo de referencias numéricas: análisis de puntos de código decimal y hexadecimal y su conversión en cadenas, incluidos caracteres astrales
Para una referencia numérica, analice el decimal después de &# o el hexadecimal después de &#x, luego convierta el punto del código numérico en un carácter con String.fromCodePoint. Un valor astral como 0x1F600 produce un emoji, no dos caracteres imprimibles independientes. La implementación también asigna valores históricos del rango de control de Windows-1252 como lo hacen los navegadores; cero, los puntos de código sustituto y los valores superiores a U+10FFFF se convierten en un carácter de reemplazo. Ese manejo explícito de errores evita que un número no válido bloquee el decodificador.
Ejemplo resuelto: decodificar una cadena que mezcla &, © y 😀; cada coincidencia se resuelve a partir de la tabla o el número
Decodifica la entrada literal &, © y 😀: la primera referencia se asigna a través de la tabla nombrada a &, el decimal 169 se convierte en © y el hexadecimal 1F600 se convierte en 😀. Incluya un <img onerror="alert(1)"> sin formato al lado de ellos. El decodificador devuelve esa secuencia de búsqueda de etiquetas como caracteres de cadena normales; no crea una imagen ni ejecuta un evento. Cuando coloque el resultado en una página real más adelante, utilice un receptor de texto seguro en lugar de tomar la cadena decodificada y asignarla nuevamente a internalHTML.
Lo que el enfoque de tabla no hará: referencias heredadas sin punto y coma y peculiaridades de recuperación de errores del analizador, a menos que se implementen deliberadamente
El enfoque de búsqueda no reproduce intencionalmente las reglas de recuperación sin punto y coma heredadas del analizador HTML. &la copia sin punto y coma puede permanecer intacta. La tabla con nombre fijo también omite muchas de las más de dos mil referencias con nombre HTML5. Esas limitaciones son compensaciones honestas para un decodificador pequeño y predecible; aceptar sólo referencias terminadas explícitamente evita tratar la prosa arbitraria que contiene un signo comercial como marca. Verifique los nombres compatibles documentados de la herramienta si es esencial la compatibilidad total del navegador.
Lo que esto no cubre: desinfectar el HTML que pretendes renderizar, que es un problema diferente.
Decodificar referencias no es desinfectar HTML para su visualización. Si el texto decodificado contiene una secuencia <script>, sigue siendo peligroso si una parte diferente de una aplicación lo inserta posteriormente como marcado. Contextos como un atributo HTML, una cadena de JavaScript y una URL necesitan cada uno su propia codificación y política de salida. ToolAcre devuelve texto; no puede hacer que un futuro fregadero inseguro sea seguro.
Conclusión: trate la entrada como datos: cómo el escape de entidad HTML se decodifica con una tabla de búsqueda en lugar del analizador HTML, para que su entrada siga siendo texto
Trate la entrada como datos. El escape de entidades HTML decodifica con una tabla y aritmética de puntos de código, no con un truco de HTML interno, por lo que las cargas útiles que buscan marcas permanecen como caracteres inertes dentro de la herramienta. Pruebe las tres referencias, luego inspeccione el texto decodificado y cómo planea usarlo a continuación: el límite de seguridad se pierde si lo analiza como HTML.