ASP.NET中的脚本漏洞 - 设置validateRequest =“true”的好建议?

时间:2011-08-21 06:52:49

标签: asp.net security xss antixsslibrary

我正在阅读有关ASP.NET Script Exploits的内容,其中一条建议是:(重点是我的;建议是“防止脚本攻击”一节中的第3条 “在网页上)

  

如果您希望应用程序接受某些HTML(例如,来自用户的一些格式化说明),则应在将HTML提交到服务器之前在客户端对其进行编码。有关更多信息,请参阅如何:通过将HTML编码应用于字符串来防止Web应用程序中的脚本漏洞利用。

这不是非常糟糕的建议吗?我的意思是,一个开发者可以通过curl或类似的东西发送HTML,然后HTML将被编码发送到服务器,这可能不是很好(?)

我在这里遗漏了什么或者误解了陈述吗?

4 个答案:

答案 0 :(得分:5)

微软的判决没有错,但另一方面远未完成,他们的判决很危险。

因为默认情况下,validateRequest == true,所以你确实应该在客户端编码特殊的HTML字符,以便它们首先进入服务器并绕过validateRequest。

但是 - 他们应该强调,这肯定是不是服务器端过滤和验证的替代

具体来说,如果您必须接受HTML,最强烈的建议是使用白名单而不是黑色过滤(即允许非常特定的HTML标记并消除所有其他标记)。强烈建议使用Microsoft AntiXSS library进行强大的用户输入过滤。它比自己“重新发明轮子”要好得多。

答案 1 :(得分:3)

我认为建议不好......

根据我的经验,我完全同意你的想法,并用以下内容取代建议:

  • 所有输入必须在到达时检查服务器端的第一件事
  • 所有可能包含“活动内容”的输入(如HTML,JavaScript ...)必须在抵达时转义,并且永远不会被发送给任何客户,直到完成全面清理。

答案 2 :(得分:1)

我永远不会相信客户端发送可信数据。正如您所说,提交数据的方式太多了。即使是非恶意用户,如果他们禁用了JavaScript,也可以绕过客户端上的系统。

然而,在link from that item上,第3点的含义变得清晰:

  

您可以通过以下方式帮助防止脚本攻击:

     

对表单变量query-string执行参数验证   变量和cookie值。此验证应包括两种类型   验证:验证变量可以转换为   期望的类型(例如,转换为整数,转换为   日期时间等,以及对预期范围或   格式。例如,一个表格post变量   应使用Int32.TryParse方法检查整数以进行验证   变量确实是一个整数。此外,得到的整数   应检查以验证该值是否在预期范围内   价值观。

     

在将值写回时,将HTML编码应用于字符串输出   回应。这有助于确保任何用户提供的字符串输入   将在浏览器中呈现为静态文本而不是可执行文件   脚本代码或解释的HTML元素。

     

HTML编码使用HTML保留字符转换HTML元素   它们是显示而不是执行。

我认为这只是一个错位字的情况,因为您无法在客户端上执行此级别的验证,并且在链接中包含的示例中显然是服务器端代码,而没有提及客户端。 修改 您还默认启用了请求验证吗?很明显,就微软而言,保护内容的重点是在服务器上。

答案 3 :(得分:0)

我认为这篇文章的作者是错误的。如果您转到链接的网页,它会在将数据发送回客户端之前进行编码,而不是相反。我认为这只是作者的一个编辑错误,他打算说相反..在它返回客户端之前对其进行编码。