Skip to main content
Blog
Blog security

¿Qué es el DOM-based XSS? Cómo funciona el cross-site scripting en el DOM

El DOM-based XSS es un ataque de cross-site scripting en el que la vulnerabilidad vive por completo en el JavaScript client-side: el propio código de la página lee entradas controladas por el atacante y las escribe en el DOM de forma insegura. Esta guía explica en qué se diferencia del XSS reflejado y almacenado, los sources y sinks más comunes, y cómo detectarlo.

Aug 18, 2026 3 min read
¿Qué es el DOM-based XSS? Cómo funciona el cross-site scripting en el DOM
Tabla de Contenidos

El DOM-based XSS es una vulnerabilidad de cross-site scripting que vive por completo en el código client-side. El propio JavaScript de la página lee entradas controlables por el atacante — la mayoría de las veces desde la URL — y las escribe en el DOM a través de un sink inseguro como innerHTML, ejecutando el script del atacante. A diferencia del XSS reflejado o almacenado, el payload malicioso puede no aparecer nunca en ninguna respuesta del servidor.

¿Cómo funciona un ataque de DOM XSS?

La vulnerabilidad es un flujo de datos desde un source que el atacante controla hasta un sink que interpreta texto como código o marcado:

// vulnerable: fragment flows straight into a sink
const name = decodeURIComponent(location.hash.slice(1));
document.querySelector("#welcome").innerHTML = "Hello " + name;
// https://example.com/#<img src=x onerror=stealCookies()>

Sources comunes: location.hash, location.search, document.referrer, window.name, los datos de postMessage y el almacenamiento client-side. Sinks comunes: innerHTML/outerHTML, document.write, eval y Function, el .html() de jQuery, y escrituras de atributos que crean manejadores o URLs (onclick, href con javascript:).

Como el fragmento de la URL nunca se envía al servidor, un payload después de # puede explotar la página mientras el servidor ve una petición perfectamente normal.

XSS reflejado vs almacenado vs DOM-based

XSS reflejadoXSS almacenadoDOM-based XSS
Dónde vive el payloadEn la petición, devuelto por el servidorEn la base de datos del servidorEn la entrada client-side (a menudo el fragmento de la URL)
¿La respuesta del servidor contiene el payload?A menudo ✗
¿Visible para WAF / logs del servidor?NormalmenteNormalmenteA menudo no
Dónde se corrigeCodificación de salida en el servidorSanitización + codificación en el servidorCódigo client-side: sinks seguros, sanitización

Por qué el DOM XSS es fácil de pasar por alto

Las defensas del lado del servidor inspeccionan peticiones y respuestas; el DOM XSS puede eludir ambas. Los frameworks reducen el riesgo — React y similares escapan por defecto — pero dangerouslySetInnerHTML, el mal uso de plantillas y los scripts de terceros en la página lo reintroducen. Y una página moderna ejecuta docenas de scripts que tú no escribiste: un sink inseguro en cualquiera de ellos es un sink inseguro en tu página. Ese problema de composición es el núcleo de la seguridad client-side.

Cómo prevenirlo y detectarlo

  • Prefiere sinks seguros: textContent en lugar de innerHTML; evita por completo eval y los manejadores construidos con strings.
  • Sanitiza cuando el HTML sea inevitable (DOMPurify o la emergente Sanitizer API), y adopta Trusted Types donde estén soportados — convierten las escrituras en sinks inseguros en violaciones de política.
  • Despliega una Content Security Policy estricta con nonces; bloquea muchos estilos de payload, aunque no toda la clase de ataque.
  • Observa el comportamiento en tiempo de ejecución: la explotación acaba manifestándose como scripts que hacen cosas que no deberían — nuevas peticiones salientes, escrituras en el DOM sobre formularios de pago, listeners inesperados. La monitorización client-side de cside observa sesiones reales en la capa del navegador, que es el único lugar donde un ataque exclusivo del DOM es visible siquiera.
Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

En el XSS reflejado el payload malicioso viaja al servidor y vuelve incrustado en la respuesta HTML. En el DOM-based XSS la respuesta del servidor puede estar completamente limpia: el propio JavaScript de la página lee el payload desde un source client-side (a menudo el fragmento de la URL, que nunca se envía al servidor) y lo inyecta en el DOM. Por eso los filtros del lado del servidor y los WAF, que inspeccionan peticiones y respuestas, pueden pasar por alto el DOM XSS por completo.

Ayuda, pero no cierra la clase de ataque. Una Content Security Policy estricta bloquea la inyección de scripts inline y los orígenes no confiables, lo que frustra muchos payloads. Pero un DOM XSS ejecutado a través de un sink inseguro de un script incluido en la lista de permitidos — o un payload que abusa de una funcionalidad permitida del framework — se mantiene dentro de la política. La CSP es una capa sólida; no sustituye corregir los sinks inseguros ni observar qué hacen realmente los scripts en tiempo de ejecución.

De forma estática, auditando las rutas del código desde los sources (location.hash, location.search, document.referrer, datos de postMessage) hasta los sinks (innerHTML, document.write, eval, setAttribute de manejadores de eventos). De forma dinámica, con escáneres conscientes del DOM y monitorizando sesiones reales en busca de comportamientos inesperados de los scripts — la vulnerabilidad solo existe en el navegador, así que la visibilidad en la capa del navegador es donde la explotación se vuelve observable.

Monitoriza y protege tus scripts de terceros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Empieza gratis o prueba Business con una versión de prueba de 14 días.

Interfaz del panel de cside que muestra la monitorización de scripts y el análisis de seguridad
Related Articles
Reservar una demo

¿Quieres verlo en detalle con un ingeniero?

Treinta minutos, sobre tu propio sitio. Nada de diapositivas.

Te enseñaremos:

Qué scripts de terceros se están ejecutando ahora mismo en tu sitio
En qué punto estás con los requisitos 6.4.3 y 11.6.1 de PCI DSS
Qué parte de tu tráfico son bots y agentes de IA

¿Prefieres mandarnos una pregunta?

Buscando huecos libres…

Solo humanos de verdad. Nos daríamos cuenta.

¿Problemas para reservar? Abrir el calendario en una pestaña nueva

¿Qué quieres resolver?

Cuéntanoslo en una línea y te responderemos con algo útil, no con un discurso genérico.

Solemos ayudar con:

Ver qué scripts de terceros se ejecutan en tu sitio
Evidencias para PCI DSS 6.4.3 y 11.6.1
Bots, agentes de IA y robo de cuentas

¿Prefieres reservar una hora? Elegir un hueco