FlawOpen

flawopen.com/XSS/CSP vs. escape

CSP y escape de salida: ¿hacen falta ambas defensas?

Página de referencia
Respuesta breve

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

La codificación contextual evita la inyección

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 CSP aplicada puede limitar algunos comportamientos inyectados

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

¿Cómo despliego una CSP más estricta?

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

Véase también Cross-Site Scripting (XSS, CWE-79): cómo funciona y cómo evitarlo en cada lenguaje — flawopen.com ¿Es seguro dangerouslySetInnerHTML en React? ¿DOMPurify basta para proteger innerHTML? ¿Markdown es seguro frente a XSS? ¿Svelte protege contra XSS por defecto? ¿La carga de SVG implica riesgo de XSS? Riesgo de XSS con Vue v-html