防止在HTML中保存恶意客户端脚本的最佳做法

时间:2009-12-31 19:09:40

标签: asp.net javascript html

我们有一个ASP.NET自定义控件,允许用户输入HTML(类似于Rich文本框)。我们注意到用户可能会在HTML视图中的<script>标记内注入恶意客户端脚本。我可以在保存时验证HTML代码,以确保删除任何<script>元素。

这就是我需要做的吗?除<script>标记以外的所有其他标记是否安全?如果你是攻击者,你还会尝试做什么?

我需要遵循哪些最佳做法?

编辑 - 为了我的目的,MS anti Xss库与本机HtmlEncode有何不同?

5 个答案:

答案 0 :(得分:6)

XSS(跨站点脚本)是一个很难解决的难题。

不是黑名单列出一些标签(并且缺少一些可能受到攻击的方式),最好决定一组适用于您网站的标签并仅允许它们。

这本身是不够的,因为你必须捕获攻击者可能尝试的所有可能的编码,并且还有其他攻击者可能会尝试的东西。有一些反xss库可以提供帮助 - here是微软的一个。

有关详情和指导,请参阅this OWASP文章。

答案 1 :(得分:2)

看看这个页面:

http://ha.ckers.org/xss.html

了解有人可能尝试的不同XSS攻击。

答案 2 :(得分:2)

从HTML中过滤掉JavaScript时,还有很多工作要做。以下是一些较大点的简短列表:

  • 需要对输入进行多次传递,以确保之前删除的内容不会创建新注入。如果您正在进行一次通过,那么<scr<script></script>ipt>alert("XSS!");</scr<script></script>ipt>之类的内容将会超过您,因为从字符串中删除<script>标记后,您将创建一个新标记。
  • javascript:href属性中删除使用src协议。
  • 剥离嵌入式事件处理程序属性,例如onmouseover/outonclickonkeypress等。
  • 白名单比黑名单更安全。只允许您知道的标签和属性是安全的。
  • 确保您正在处理所有相同的字符编码。如果您将输入视为ASCII(单字节)并且输入具有Unicode(多字节)字符,则会产生令人讨厌的惊喜。

这是一个更完整的cheat sheet。此外,Oliha.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,objectiframe标记等。< / p>

最好的方法是将网址的标签,属性和类型列入白名单(并使白名单尽可能小,以便做到您需要的),而不是列入黑名单。这意味着您只允许您知道的某些标签是安全的,而不是禁止您认为危险的标签。这样,人们攻击你的系统的可能方式就会减少,因为你不会想到的标签是不允许的,而不是将你错过的地方列入黑名单,你仍然会有一个漏洞。 Here's an example白名单的消毒方法。