3

我正在阅读有关ASP.NET Script Exploits的内容,其中一个建议是:(
重点是我的;该建议是网页中“防范脚本漏洞”部分中的#3)

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

这不是很糟糕的建议吗?我的意思是,利用者可以通过 curl 或类似的方式发送 HTML,然后 HTML 会以未编码的方式发送到服务器,这不太好(?)

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

4

4 回答 4

5

微软在他们的句子中没有错,但另一方面远未完成,而且他们的句子很危险。

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

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

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

于 2011-08-21T07:01:18.883 回答
3

我觉得这个建议不好...

根据我的经验,我完全同意您的想法,并将该建议替换为以下内容:

  • 所有输入必须在到达时首先在服务器端进行检查
  • 所有可能包含“活动内容”(如 HTML、JavaScript ......)的输入必须在到达时转义,并且在完全清理之前永远不会发送给任何客户端
于 2011-08-21T06:58:46.083 回答
1

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

但是,在该项目的链接上,它们对第 3 点的含义变得很清楚:

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

对表单变量、查询字符串变量和 cookie 值执行参数验证。此验证应包括两种类型的验证:验证变量可以转换为预期类型(例如,转换为整数、转换为日期时间等),以及验证预期范围或格式。例如,应使用 Int32.TryParse 方法检查旨在为整数的表单 post 变量,以验证该变量是否确实是整数。此外,应检查结果整数以验证该值是否在预期的值范围内。

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

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

我认为这只是一个用词不当的情况,因为您无法在客户端上执行这种级别的验证,并且在链接中包含的示例中,显然是在没有提及客户端的情况下呈现了服务器端代码。 编辑: 默认情况下您还启用了请求验证,对吗?很明显,就微软而言,保护内容的重点在于服务器。

于 2011-08-21T07:01:10.930 回答
0

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

于 2011-08-21T07:05:54.087 回答