FlawOpen

flawopen.com/Angular 安全/Angular

Angular XSS 防护:安全默认行为与绕过 API

参考页面
简要结论

Angular 默认将模板绑定中的值视为不可信:插值会转义文本,HTML 和 URL 绑定会按上下文清理。危险边界在于显式信任:bypassSecurityTrust* 会要求 Angular 跳过该值的常规清理。只有在针对其使用的确切安全上下文完成验证和构造后,才使用此 API。

RISKY — the escape hatch
this.safeHtml = this.sanitizer
  .bypassSecurityTrustHtml(comment);
// <div [innerHTML]="safeHtml"></div>
更安全——将不可信输入保留为文本
<div>{{ comment }}</div>
// 插值会将标记转义为文本

Angular 会清理什么——又有哪些内容无法清理

Angular 会转义插入的文本,并在 HTML 和 URL 上下文中清理不可信值。例如,[innerHTML] 会移除危险标记并保留安全 HTML;普通插值根本不会解析标记。资源 URL(例如加载可执行内容的 iframe 来源)可能指向任意代码,因此无法进行通用清理。不要将攻击者可控的值传给 bypassSecurityTrustHtml、bypassSecurityTrustUrl、bypassSecurityTrustResourceUrl 或相关绕过 API:这些 API 会声明值在特定上下文中安全并跳过清理。确需嵌入内容时,应在标记为可信之前,使用固定 origin 和经过验证的标识符构造 URL。

审计绕过 API 和 DOM sink

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

常见问题

使用 CSP 和 Trusted Types 进行纵深防御

在使用 Angular 安全绑定的同时,配置 Content Security Policy (CSP) 并强制执行 Trusted Types,作为纵深防御。应用调用 DomSanitizer.bypassSecurityTrust* 时,Angular 要求配置 Trusted Types 策略 angular#unsafe-bypass。尽量移除这些调用;若确有必要,请逐一登记调用位置,并且只信任针对其确切上下文完成验证的值。

Angular 会清理所有写入 DOM 的方式吗?

不会。模板绑定受框架保护,但直接 DOM API、ElementRef 和第三方 DOM 库可能绕过这些保护。优先使用模板绑定,单独审计这些 sink;除非已针对准确的安全上下文完成验证,否则不要将输入标记为可信。

参考资料

另请参阅 XSS 跨站脚本攻击(CWE-79):原理与各编程语言的防护方法 — flawopen.com MIME 嗅探 XSS:Content-Type 与 nosniff CSP 与输出转义:两者都需要吗? React 的 dangerouslySetInnerHTML 安全吗? DOMPurify 足以保护 innerHTML 吗? Markdown 渲染能防御 XSS 吗? Svelte 默认能防止 XSS 吗?