Mcatorce Suite
← Volver al blog

Escapar la salida HTML para prevenir XSS: qué protege y qué no protege la codificación

Cómo la codificación de salida detiene el cross-site scripting, por qué el escape correcto depende de dónde caen los datos y los hábitos que mantienen seguro el contenido del usuario.

Prueba la herramienta: Codificador de Entidades HTML

El cross-site scripting (XSS) ocurre cuando una página incluye texto de un usuario y el navegador lo trata como código. Si un comentario contiene <script> y lo insertas sin cambios en la página, el navegador lo ejecuta. Codificar los caracteres especiales convierte ese texto de nuevo en caracteres inofensivos y visibles.

La idea de la codificación de salida

Codifica los datos en el momento de colocarlos en la página, con las reglas del lugar donde caen. El mismo valor necesita tratamientos distintos según el contexto:

  • Texto del cuerpo HTML: escapa &, < y >.
  • Valores de atributos HTML: escapa también las comillas y envuelve siempre el valor entre comillas.
  • Cadenas de JavaScript: usa el escape de JavaScript, no entidades HTML.
  • URL: usa codificación de URL y valida el esquema para rechazar enlaces javascript:.
  • CSS: evita insertar datos del usuario en reglas de estilo.

Usar el codificador equivocado para el contexto puede dejar un hueco aunque se haya escapado algo.

Deja que el framework lo haga

Los frameworks modernos, incluidos Svelte, React y la mayoría de los motores de plantillas, escapan el texto por defecto. Los momentos peligrosos son las salidas de emergencia: {@html ...} en Svelte, dangerouslySetInnerHTML en React e innerHTML en JavaScript puro. Úsalas solo con contenido de confianza o saneado con una librería de saneamiento bien mantenida.

Codificar no es sanear

Codificar muestra el HTML del usuario como texto. Sanear permite algo de HTML, como negritas y enlaces, y elimina las partes inseguras. Si quieres permitir formato, usa un sanitizador o un formato restringido como Markdown con HTML sin procesar desactivado.

Defensa en profundidad

Una Content Security Policy limita qué scripts pueden ejecutarse aunque algo se cuele. Las cookies marcadas como HttpOnly no pueden ser leídas por scripts.

Preguntas frecuentes

¿Codifico al recibir o al mostrar? Guarda el dato original y codifica al mostrarlo, porque la codificación correcta depende de dónde se muestra.