ASP.NET中的脚本利用-正在设置validateRequest=";“真的”;好建议?

ASP.NET中的脚本利用-正在设置validateRequest=";“真的”;好建议?,asp.net,security,xss,antixsslibrary,Asp.net,Security,Xss,Antixsslibrary,我正在阅读,其中一条建议是:(重点是我的;建议是“防止脚本攻击”一节中的第3条 “在网页中) 如果希望应用程序接受某些HTML(例如,用户提供的一些格式说明),则应在将HTML提交到服务器之前在客户端对其进行编码。有关更多信息,请参见如何:通过对字符串应用HTML编码来防止Web应用程序中的脚本攻击 这不是很糟糕的建议吗?我的意思是,开发人员可以通过curl或类似的方式发送HTML,然后将HTML以未编码的方式发送到服务器,这不好(?) 我是在这里遗漏了什么还是误读了这句话?我认为这个建议不好

我正在阅读,其中一条建议是:
(重点是我的;建议是“防止脚本攻击”一节中的第3条 “在网页中)

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

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


我是在这里遗漏了什么还是误读了这句话?

我认为这个建议不好

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

  • 所有输入必须在到达时首先在服务器端进行检查
  • 所有可能包含“活动内容”(如HTML、JavaScript…)的输入必须在到达时转义,并且在完全清除之前,不得发送到任何客户端

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

然而,从表面上看,第3点的含义变得很清楚:

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

对表单变量、查询字符串执行参数验证 变量和cookie值。此验证应包括两种类型 验证:验证变量是否可以转换为 所需的类型(例如,转换为整数,转换为 日期、时间等),并验证预期范围或 格式化。例如,一个表单post变量 应使用Int32.TryParse方法检查整数以进行验证 这个变量实际上是一个整数。此外,得到的整数 应检查以验证该值是否在预期范围内 价值观

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

HTML编码使用HTML–保留字符转换HTML元素,因此 它们被显示而不是执行

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

微软的判决没有错,但另一方面,判决远未完成,而且判决是危险的。

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

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


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

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

请向所有回答者查看这篇文章,谢谢,是的,链接页面确实进一步解释了问题,但我质疑的是声明本身。所有答案都很好,因为它更清楚地解释了问题,所以将这篇文章标记为已接受。但我不知道,Ofer,你为什么说“微软在他们的句子中没有错”——这句话显然是错的——也许我也应该把你应该编码的单词加粗?本指南适用于应用程序应接受合法HTML输入的情况,例如为用户提供富文本编辑(例如编辑博客文章)时。在这种情况下,从技术上讲,您确实应该在客户端对客户端输入进行编码,否则您将无法通过.Net的ValidateRequest障碍。这就是说,它肯定不会取代强大的服务器端验证。这就是本文中MS的错误——他们应该在这句话之后立即强调,服务器验证无论如何都必须进行。