flawopen.com/Angular 安全/Angular
Angular XSS 防护:安全默认行为与绕过 API
Angular 默认将模板绑定中的值视为不可信:插值会转义文本,HTML 和 URL 绑定会按上下文清理。危险边界在于显式信任:bypassSecurityTrust* 会要求 Angular 跳过该值的常规清理。只有在针对其使用的确切安全上下文完成验证和构造后,才使用此 API。
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。尽量移除这些调用;若确有必要,请逐一登记调用位置,并且只信任针对其确切上下文完成验证的值。
不会。模板绑定受框架保护,但直接 DOM API、ElementRef 和第三方 DOM 库可能绕过这些保护。优先使用模板绑定,单独审计这些 sink;除非已针对准确的安全上下文完成验证,否则不要将输入标记为可信。