XSS en React: dangerouslySetInnerHTML y scripts de terceros
Comprenda cómo el escape predeterminado de React evita XSS, cuándo dangerouslySetInnerHTML es peligroso y cómo los scripts de terceros introducen riesgos.
XSS en React: dangerouslySetInnerHTML y scripts de terceros es una lección gratuita de React Academy en CoddyKit. Esta es la lección 1 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 React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
La protección XSS integrada de React
React escapa automáticamente todos los valores renderizados mediante JSX antes de insertarlos en el DOM. Cuando escribe {userInput} en JSX, React realiza el equivalente a asignar mediante textContent; el valor se trata como texto, nunca como HTML. De forma predeterminada, esto evita la mayoría de los ataques XSS en las aplicaciones de React.
Qué hace dangerouslySetInnerHTML
dangerouslySetInnerHTML={{ __html: htmlString }} es el mecanismo de escape de React que omite el escape automático. El nombre es intencionadamente alarmante: indica que usted asume la responsabilidad de la seguridad de la cadena HTML. React establece innerHTML directamente y ejecuta cualquier HTML, incluidos scripts y controladores de eventos.
Usos legítimos
Realmente necesita dangerouslySetInnerHTML al renderizar HTML procedente de un editor de texto enriquecido (como TipTap o Quill), de un CMS que almacena HTML o de un convertidor de Markdown a HTML. Estas fuentes producen marcado HTML real que debe renderizarse como HTML, no como texto escapado.
El vector de ataque
Si la cadena HTML contiene <script>stealCookies()</script> o <img src=x onerror="stealData()">, establecerla como innerHTML ejecuta el código del atacante. Cualquier contenido proporcionado por el usuario que se pase directamente a dangerouslySetInnerHTML sin sanitización constituye una vulnerabilidad XSS crítica.
DOMPurify: el sanitizador estándar
DOMPurify es el sanitizador de HTML estándar del sector para navegadores. Analiza la cadena HTML en un contexto aislado, elimina elementos y atributos peligrosos (etiquetas de script, controladores de eventos y URL javascript:) y devuelve una cadena HTML segura. Uso: DOMPurify.sanitize(dirtyHtml) antes de pasarla a dangerouslySetInnerHTML.
Riesgos de los scripts de terceros
Los scripts de terceros (analítica, widgets de chat y redes publicitarias) se ejecutan con los mismos permisos que el JavaScript de su aplicación. Un script de terceros comprometido o malicioso puede leer document.cookie, acceder a localStorage, leer los campos de los formularios y realizar solicitudes a servidores externos, todo ello sin que el usuario lo advierta.
La Content Security Policy como capa de defensa
Content Security Policy es una cabecera HTTP que declara qué scripts pueden ejecutarse. Aunque se inyecte una carga útil XSS en el DOM, una CSP configurada correctamente puede bloquear su ejecución al restringir los scripts en línea y permitir únicamente fuentes de scripts incluidas en la lista de confianza. CSP es la segunda línea de defensa después de la sanitización de entradas.
Ataques a la cadena de suministro mediante npm
Los paquetes de npm son un vector de ataque XSS real. Una dependencia puede incluir código malicioso que exfiltre variables de entorno o datos de usuarios. El incidente de node-ipc de 2022 y el compromiso de ua-parser-js de 2021 demostraron que paquetes ampliamente utilizados pueden ser tomados y manipulados con código malicioso. Audite las dependencias con npm audit y utilice archivos de bloqueo.
Qué hacen los atacantes con XSS
Un ataque XSS exitoso permite al atacante robar el token JWT del usuario almacenado en sessionStorage (enviándolo a un servidor controlado por el atacante), realizar acciones como el usuario autenticado (llamadas a la API utilizando la sesión del usuario), modificar el DOM para mostrar contenido de phishing o registrar cada pulsación de tecla que el usuario realice en la aplicación.
API Trusted Types
La API del navegador Trusted Types exige que todos los puntos de inserción del DOM (innerHTML, eval, script.src) reciban objetos con tipos especiales en lugar de cadenas sin procesar. Esto impide que las cargas útiles XSS basadas en cadenas lleguen al DOM desde la propia plataforma. React está trabajando para ofrecer compatibilidad con Trusted Types y CSP puede exigir su uso.
Patrones seguros para el contenido de un CMS
El patrón seguro para renderizar HTML de un CMS es el siguiente: obtenga el HTML, páselo por DOMPurify.sanitize() con una lista de elementos y atributos seguros permitidos y, después, renderícelo con dangerouslySetInnerHTML={{ __html: cleanHtml }}. Nunca omita el paso de sanitización, aunque confíe en el CMS, porque la propia base de datos del CMS podría estar comprometida.
Finalidad de DOMPurify
¿Qué hace DOMPurify cuando se llama a DOMPurify.sanitize(htmlString)?
Resumen de la lección
React escapa automáticamente los valores de JSX, lo que evita la mayoría de los ataques XSS. dangerouslySetInnerHTML omite esta protección para permitir el renderizado legítimo de HTML; sanitice siempre la entrada con DOMPurify primero. Los scripts de terceros y los paquetes de npm comprometidos son vectores de XSS en la cadena de suministro. Content Security Policy proporciona una segunda capa de defensa. Un ataque XSS exitoso permite robar tokens, suplantar identidades y mostrar phishing.
Preguntas frecuentes
¿La lección «XSS en React: dangerouslySetInnerHTML y scripts de terceros» es gratis?
Sí — el texto completo de «XSS en React: dangerouslySetInnerHTML y scripts de terceros» 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 React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «XSS en React: dangerouslySetInnerHTML y scripts de terceros»?
Comprenda cómo el escape predeterminado de React evita XSS, cuándo dangerouslySetInnerHTML es peligroso y cómo los scripts de terceros introducen riesgos. Practicas React 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 React Academy?
No se requiere experiencia previa. React 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 1 de 4.
¿Cuánto tiempo toma la lección «XSS en React: dangerouslySetInnerHTML y scripts de terceros»?
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 React Academy?
Sí. Cada lección de React 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
- XSS en React: dangerouslySetInnerHTML y scripts de terceros
- Protección contra CSRF en configuraciones de React y API
- Política de seguridad de contenido para aplicaciones React
- Gestión de secretos y variables de entorno