flawopen.com/XSS/CSP vs. escape
CSP y escape de salida: ¿hacen falta ambas defensas?
La codificación contextual de salida coloca valores no confiables como datos, no como marcado ejecutable. Una Content Security Policy (CSP) es una segunda capa: como un guardia que comprueba qué scripts pueden ejecutarse y a dónde pueden conectarse, puede bloquear algunos comportamientos inyectados si falla la codificación. No corrige el fallo, y una política permisiva quizá no detenga el script.
Qué hace cada defensa
Codifica cuando los datos entran en el contexto de salida. El texto HTML, los atributos entrecomillados, JavaScript, CSS y los componentes URL tienen reglas de análisis distintas; el codificador adecuado depende del contexto exacto. Prefiere las plantillas del framework y los sinks DOM seguros; evita colocar datos no confiables en contextos ejecutables, como scripts inline o atributos de eventos. Esta es la defensa principal contra XSS.
Una Content-Security-Policy aplicada puede restringir scripts inline, orígenes de scripts y destinos como connect-src. Si falla la codificación, una política bien diseñada puede bloquear un script o una conexión concretos. El resultado depende de la política y del navegador: CSP no garantiza detener todos los payloads, fugas de datos o script gadgets, y la inyección sigue existiendo.
Por qué CSP no sustituye a la codificación de salida
Una política permisiva o mal configurada puede dejar ejecutable la inyección. Permitir 'unsafe-inline', por ejemplo, debilita la protección frente a scripts inline; las listas amplias de hosts también pueden admitir endpoints que sirven scripts. Las directivas CSP tienen distintas funciones: una política que limita script-src puede necesitar un connect-src deliberado para restringir destinos de red. Content-Security-Policy-Report-Only informa de infracciones, pero no las bloquea. Usa codificación de salida como corrección y CSP como defensa en profundidad.
Preguntas frecuentes
Inventaría los scripts necesarios y prueba una política basada en nonce o hash que evite 'unsafe-inline' y 'unsafe-eval'. Usa Content-Security-Policy-Report-Only para detectar incompatibilidades; no aplica la política. Revisa los informes, corrige dependencias legítimas y despliega después una Content-Security-Policy efectiva. Mantén la codificación contextual durante todo el proceso.
Referencias
- OWASP — guía de Content Security Policy
- OWASP — prevención de Cross-Site Scripting
- MDN — implementación de Content Security Policy
- W3C — Content Security Policy Level 3