AngularJs如何防止输入<script>标签

时间:2019-12-30 11:46:39

标签: javascript html angularjs validation xss

我允许用户使用以下内容输入文本:

<textarea ng-model="UserComment.text" rows="4" required maxlength="4000" />

现在,这允许用户输入

<script>alert('Hello world!');</script>

这将完全按照脚本标记的输入(如果未过滤)保存到我的数据库中-这非常危险。 我知道我何时使用以下ng-bind

渲染该输入

<div class="user-comment-text">{{UserComment.text}}</div>

默认情况下将对其进行清理,并且脚本标签将使用<和>进行HTML编码,并呈现为&lt;&gt;,因此脚本标签不会作为脚本执行。但是将这些标记保存在数据库中很危险,因此我想过滤<script>标记(以及任何其他危险的输入)以防止输入-这样做的最佳方法是什么?

我希望有一个比正则表达式(ng-pattern)更好的解决方案,因为几乎不可能实现多语言的正确选择。我目前的想法是在控制器中使用不区分大小写的c#正则表达式在服务器上进行清理,以去除<script>标签-但也存在其他脚本问题-例如img onerror事件和带有JavaScript URL的href。我想先解决脚本元素,然后再担心其他元素。谢谢。

1 个答案:

答案 0 :(得分:1)

尝试正则表达式。

var rgx = /<\/?script>/gi;
var snippet = "<script>alert('alert1')</script> stuff <script>alert('alert2')</script>";
var result = snippet.replace(rgx, '[script]');

是一个非常简单的示例。预期的输出将是

alert('alert1') stuff alert('alert2')

您可以修改[script] [/ script],而不是完全删除它,以免丢失有人试图恶意的内容。您还可以检查<和>

如上所述,请清理所有内容,如果您的数据库是SQL,请使用SqlParameters。