我们有一个ASP.NET自定义控件,允许用户输入HTML(类似于Rich文本框)。我们注意到用户可能会在HTML视图中的<script>
标记内注入恶意客户端脚本。我可以在保存时验证HTML代码,以确保删除任何<script>
元素。
这就是我需要做的吗?除<script>
标记以外的所有其他标记是否安全?如果你是攻击者,你还会尝试做什么?
我需要遵循哪些最佳做法?
编辑 - 为了我的目的,MS anti Xss库与本机HtmlEncode有何不同?
答案 0 :(得分:6)
XSS(跨站点脚本)是一个很难解决的难题。
不是黑名单列出一些标签(并且缺少一些可能受到攻击的方式),最好决定一组适用于您网站的标签并仅允许它们。
这本身是不够的,因为你必须捕获攻击者可能尝试的所有可能的编码,并且还有其他攻击者可能会尝试的东西。有一些反xss库可以提供帮助 - here是微软的一个。
有关详情和指导,请参阅this OWASP文章。
答案 1 :(得分:2)
答案 2 :(得分:2)
从HTML中过滤掉JavaScript时,还有很多工作要做。以下是一些较大点的简短列表:
<scr<script></script>ipt>alert("XSS!");</scr<script></script>ipt>
之类的内容将会超过您,因为从字符串中删除<script>
标记后,您将创建一个新标记。javascript:
和href
属性中删除使用src
协议。onmouseover/out
,onclick
,onkeypress
等。这是一个更完整的cheat sheet。此外,Oli与ha.ckers.org的好文章相关联,并附有样本以测试您的过滤效果。
答案 3 :(得分:0)
仅删除<script>
标记是不够的,因为有很多方法可以在输入中编码/隐藏它们。现在大多数语言都有anti-xss和anti-csrf库以及用于过滤输入的函数。您应该使用其中一个通常商定的库来过滤您的用户输入。
我不确定ASP.NET中最好的选项是什么,但这可能会有所启发: http://msdn.microsoft.com/en-us/library/ms998274.aspx
答案 4 :(得分:0)
这称为Cross Site Scripting (XSS) attack。它们很难防止,因为有很多令人惊讶的方法可以让JavaScript代码执行(javascript:
网址,有时是CSS,object
和iframe
标记等。< / p>
最好的方法是将网址的标签,属性和类型列入白名单(并使白名单尽可能小,以便做到您需要的),而不是列入黑名单。这意味着您只允许您知道的某些标签是安全的,而不是禁止您认为危险的标签。这样,人们攻击你的系统的可能方式就会减少,因为你不会想到的标签是不允许的,而不是将你错过的地方列入黑名单,你仍然会有一个漏洞。 Here's an example白名单的消毒方法。