我允许用户使用以下内容输入文本:
<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编码,并呈现为<
和>
,因此脚本标签不会作为脚本执行。但是将这些标记保存在数据库中很危险,因此我想过滤<script>
标记(以及任何其他危险的输入)以防止输入-这样做的最佳方法是什么??
我希望有一个比正则表达式(ng-pattern)更好的解决方案,因为几乎不可能实现多语言的正确选择。我目前的想法是在控制器中使用不区分大小写的c#正则表达式在服务器上进行清理,以去除<script>
标签-但也存在其他脚本问题-例如img onerror事件和带有JavaScript URL的href。我想先解决脚本元素,然后再担心其他元素。谢谢。
答案 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。