所以,我一直在学习如何用vanillaJS创建路由器的教程。然后作者指定这只是为了理解事情是如何工作的,但我们最好使用Angular或React这样的框架,原因有很多,其中之一是Angular在将用户输入插入HTML之前对其进行了净化。
我的问题是,既然Angular都是前端的,那么哪种机制可以防止黑客操纵它接受他的恶意代码?也许Angular调用了一些后端API?这仍然可以被操纵,不是吗?
Angular对模板中使用的任何值进行过滤和编码,以便无论插入的数据如何,这些值都保持安全。请参见角度安全性。
用户可以将恶意数据作为输入发送,但如果在输出时对其进行了正确编码,则不会执行任何操作。
在angular中,您可以验证表单输入,例如:
<input id="name" name="name" class="form-control"
required minlength="4" appForbiddenName="bob"
[(ngModel)]="hero.name" #name="ngModel" >
<div *ngIf="name.invalid && (name.dirty || name.touched)"
class="alert alert-danger">
<div *ngIf="name.errors.required">
Name is required.
</div>
<div *ngIf="name.errors.minlength">
Name must be at least 4 characters long.
</div>
<div *ngIf="name.errors.forbiddenName">
Name cannot be Bob.
</div>
</div>
但理论上,恶意用户仍然可以通过一些被操纵的输入向api发送请求。为了防止这种情况,您的API、后端服务器需要尽可能多地进行验证。如果您的API只接受某些输入,那么您的应用程序至少是;"安全";防止恶意用户输入。
您引用的内容称为DOM XSS或模板注入。像其他javascript框架(以及一般的软件(一样,Angular并不完美。角度解析安全性已经被破坏并修复。但通常是应用程序开发人员会犯错误。很多时候,代码示例被解释为软件的全功能片段,并在没有任何安全测试的情况下复制粘贴到多个源中。
阿雷的回答完全错误。XSS检测也必须在客户端进行,以避免完全无法检测到的客户端注入,主要是DOM注入,但也可以在客户端停止一些变异XSS或奇怪的浏览器行为,但在服务器端不能停止。这就是为什么一些顶级安全专家正在努力开展这样的项目:https://github.com/cure53/DOMPurify
例如,如果你正在读取哈希URL(就像js-router一样(,如果设计不好或出现错误,可能会出现恶意注入。在innerHTML、模板、eval或html属性和其他接收器上非常常见。
我给你举了一个你可以测试的简单例子:
<html>
<body>
<script>
eval(location.hash.substr(1))
</script>
</body>
</html>
只需将其保存为xs.html并将#alert(1(附加到url即可。当你使用#时,url不会发送到服务器,没有办法在服务器端检测到这个漏洞,因为浏览器会从对服务器的请求中删除#和地址栏中的所有内容。
在这样的例子中,我可以在你的网站上回复登录页面,并使用javascript添加一个键盘记录程序,在#url之后将其发送给合法用户。他会信任这个链接并失去他的账户。在大多数情况下,可以在20行javascript中完成。网址很容易伪造:https://example.com/home/newFeature/login.php
因此angular不会单独调用后端api。但我可以想象,它会用正则表达式检查恶意代码,或者做一些类似的魔术。但如果你想有一个真正的验证,它永远不应该在前端。
前端验证应用于帮助用户填写正确的数据。如果您希望验证安全性和恶意代码。它应该发生在后端。