FlawOpen

flawopen.com/Seguridad de Angular/Angular

Protección XSS de Angular: valores seguros y APIs de omisión

Página de referencia
Respuesta breve

Angular considera no confiables los valores de los enlaces de plantilla: la interpolación escapa el texto y los enlaces HTML y URL aplican saneamiento contextual. El límite peligroso es la confianza explícita: bypassSecurityTrust* indica a Angular que omita el saneamiento habitual de ese valor. Úsalo solo después de validar y construir el valor para el contexto de seguridad exacto donde se utilizará.

RISKY — the escape hatch
this.safeHtml = this.sanitizer
  .bypassSecurityTrustHtml(comment);
// <div [innerHTML]="safeHtml"></div>
MÁS SEGURO — conserva la entrada no confiable como texto
<div>{{ comment }}</div>
// la interpolación escapa el marcado como texto

Qué sanea Angular y qué no puede sanear

Angular escapa el texto interpolado y sanea valores no confiables en contextos HTML y URL. Por ejemplo, [innerHTML] elimina el marcado peligroso y conserva HTML seguro; la interpolación normal ni siquiera interpreta el marcado. Una URL de recurso (como la fuente de un iframe que carga contenido ejecutable) no se puede sanear de forma genérica porque puede señalar código arbitrario. Nunca pases valores controlados por atacantes a bypassSecurityTrustHtml, bypassSecurityTrustUrl, bypassSecurityTrustResourceUrl ni a otras APIs de omisión: afirman que el valor es seguro para un contexto específico y omiten el saneamiento. Para una inserción legítima, construye la URL a partir de un origen fijo y un identificador validado justo antes de marcarla como confiable.

Audita las APIs de omisión y los sinks del DOM

grep -rn "bypassSecurityTrust" --include="*.ts" .

Preguntas frecuentes

Defensa en profundidad con CSP y Trusted Types

Use Content Security Policy (CSP) y aplique Trusted Types como defensa en profundidad junto con los bindings seguros de Angular. Angular requiere la política Trusted Types angular#unsafe-bypass cuando una aplicación llama a DomSanitizer.bypassSecurityTrust*. Prefiera eliminar esas llamadas; si alguna es necesaria, inventaríe cada punto de llamada y confíe solo en valores validados para su contexto exacto.

¿Angular sanea todas las formas de escribir en el DOM?

No. Los enlaces de plantilla reciben las protecciones del framework, pero las API directas del DOM, ElementRef y las bibliotecas DOM de terceros pueden eludirlas. Prefiere los enlaces de plantilla, audita esos sinks por separado y no marques una entrada como confiable sin validarla para el contexto de seguridad exacto.

Referencias

Véase también Cross-Site Scripting (XSS, CWE-79): cómo funciona y cómo evitarlo en cada lenguaje — flawopen.com XSS por MIME sniffing: Content-Type y nosniff CSP y escape de salida: ¿necesitas ambos? ¿Es seguro dangerouslySetInnerHTML en React? ¿DOMPurify basta para proteger innerHTML? ¿Markdown es seguro frente a XSS? ¿Svelte protege contra XSS por defecto?