angular 在插值(`{{ }}`)中自动对内容进行 html 实体编码,将 ``),既不执行脚本,也不依赖 `domsanitizer` 进行主动过滤——这是编译时的默认安全机制。
在 Angular 中,插值绑定(如
{{ test }})不会将字符串解析为 HTML,而是将其作为纯文本插入 DOM。这意味着即使 test = '',Angular 也会自动将 、" 等字符转换为对应的 HTML 实体(例如 zuojiankuohaophpcnscriptyoujiankuohaophpcnalert("xss")zuojiankuohaophpcn/scriptyoujiankuohaophpcn),最终在页面上显示为可见的源码文本,而非可执行的脚本。这与 [innerHTML] 的行为有本质区别:
]:明确要求渲染 HTML,因此 Angular 会调用 DomSanitizer.sanitize(SecurityContext.HTML, value),主动移除
因此,回答你的两个问题:
✅ 正确示例(安全,默认行为):
test = '';
{{ test }}
❌ 错误尝试(危险!禁止):
⚠️ 注意事项:
总之,Angular 插值的安全性源于“不解析、只转义”的设计哲学——它不是“忘了消毒”,而是以更保守的方式从根本上杜绝 XSS 执行路径。