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

Asp.net 防止在HTML中保存恶意客户端脚本的最佳做法,asp.net,javascript,html,Asp.net,Javascript,Html,我们有一个ASP.NET自定义控件,允许用户输入HTML(类似于富文本框)。我们注意到,用户可能会在HTML视图的标记中插入恶意客户端脚本。我可以在保存时验证HTML代码,以确保删除任何元素 这就是我需要做的吗?除了标签以外的所有其他标签都是安全的吗?如果你是攻击者,你还会尝试做什么 我需要遵循哪些最佳实践 编辑-就我而言,MS anti-Xss库与本机HtmlEncode有何不同?(跨站点脚本)是一个很难正确处理的主题 与其黑名单一些标签(并错过一些可能受到攻击的方式),不如决定一组适合您的站

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

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

我需要遵循哪些最佳实践

编辑-就我而言,MS anti-Xss库与本机HtmlEncode有何不同?

(跨站点脚本)是一个很难正确处理的主题

与其黑名单一些标签(并错过一些可能受到攻击的方式),不如决定一组适合您的站点的标签,并且只允许它们

这本身是不够的,因为您必须捕获攻击者可能尝试的所有可能的编码,并且攻击者还可能尝试其他方法。有一些反xss库可以提供帮助—这是一个来自Microsoft的库

有关更多信息和指导,请参阅文章。

仅删除
标记是不够的,因为有很多方法可以在输入中编码/隐藏它们。大多数语言现在都有反xss和反csrf库以及过滤输入的函数。您应该使用这些公认的库中的一个来过滤用户输入

我不确定ASP.NET中的最佳选项是什么,但这可能会有一些启示:

看看这一页:

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

这称为。它们很难防止,因为有很多让JavaScript代码执行的令人惊讶的方法(
JavaScript:
URL,有时是CSS、
object
iframe
标记等)


最好的方法是将标签、属性和URL类型列入白名单(并将白名单保持在尽可能小的范围内以满足您的需要),而不是列入黑名单。这意味着你只允许某些你知道是安全的标签,而不是禁止你认为是危险的标签。通过这种方式,人们进入您的系统的可能方式会减少,因为您没有想到的标签将不被允许,而不是将您遗漏的内容列入黑名单,因为如果您遗漏了某些内容,您仍然会有漏洞。在从HTML中过滤JavaScript时,有很多事情要做。以下是一些要点的简短列表:

  • 需要对输入进行多次传递,以确保之前删除的内容不会创建新的注入。如果您只进行一次传递,则可以执行以下操作:
    alert(“XSS!”)将通过您,因为从字符串中删除
    标记后,您将创建一个新标记
  • href
    src
    属性中取消使用
    javascript:
    协议
  • 剥离嵌入式事件处理程序属性,如
    onmouseover/out
    onclick
    onkeypress
  • 白名单比黑名单安全。只允许您知道是安全的标记和属性
  • 确保处理的是所有相同的字符编码。如果你像对待ASCII(单字节)一样对待输入,并且输入有Unicode(多字节)字符,你会得到一个令人不快的惊喜

这里有一个更完整的例子。另外,链接到一篇关于使用示例测试过滤的好文章。

一定要使用现有的库,它实现了parse+白名单方法!除了只允许白名单标记和属性外,您还需要确保库处理不同浏览器的html解析中的怪癖!例如,退格字符可能会导致您的解析器将某些HTML作为非标记跳过,但浏览器可能会将其解释为“”。是否有所有允许标记的白名单示例?反Xss库与本机HtmlEncode有何不同?@Oded Microsoft Xss库的链接是一个非常过时的版本(2006年11月20日发布的1.5版)。最新版本是2009年9月15日发布的3.1版。以下是谷歌文档支持的标签列表。请注意,并非所有不支持的标签都会导致XSS问题(有些只是contenteditable不支持):是否有我可以使用的白名单标记和属性的示例?您是否查看了我链接的示例?它有一个可以白名单标记和属性的示例列表。