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.

