我想使用Angular,我发现这是关于安全性的:https://angular.io/guide/security只有使用angular才能保护您免受所有XSS攻击,这是对的吗?不管数据是来自数据库还是来自用户输入?
TL;DR-是的,有点。这取决于您使用的Angular版本。
默认情况下不受信任
现在,Angular对插入模板中的每个变量都使用了消毒函数,除非您另有说明(使用旁路函数(。函数本身使用起来非常安全,它覆盖了大多数上下文,包括-HTML、Style(CSS(、hrefs(例如,来自javascript(。此外,Angular会(使用浏览器控制台(通知您"消毒"功能所做的每一次更改。
Angular不会覆盖你的地方
使用服务器端模板来创建HTML,或者在资源URL中使用模板注入(例如
如何解决
有很多技术,但今天最安全和最先进的是CSP(内容安全策略(,你可以使用谷歌创建的工具创建和评估你的CSP
Angular旧版本中的XSS
在Angular的旧版本(如1.5(中,存在一系列"模板注入"漏洞,即恶意使用可以使用{{}}括号将自己的受控输入注入HTML。例如,如果用户正在使用以下模板:
<p class="e2e-inner-html-interpolated">{{username}}</p>
他可以选择一个用户名为"alert(alert(document.cookie((",结果是:
<p class="e2e-inner-html-interpolated"><script>alert(alert(document.cookie))</script></p>
这意味着他可以直接将HTML注入页面本身。Angular多年来一直试图修复它,但没有取得多大成功(直到几个版本之前(。
尽管使用Angular通常会降低XSS的风险,但我们不能说你绝对没有风险。例如,ViewChild
和ViewChildren
的文档警告您不要使用ElementRef.nativeElement
。他们建议使用安全的Renderer2
函数,而不是访问nativeElement原始DOM函数和属性,如innerHTML
。