我正在阅读有关ASP.NET Script Exploits的内容,其中一条建议是:(重点是我的;建议是“防止脚本攻击”一节中的第3条 “在网页上)
如果您希望应用程序接受某些HTML(例如,来自用户的一些格式化说明),则应在将HTML提交到服务器之前在客户端对其进行编码。有关更多信息,请参阅如何:通过将HTML编码应用于字符串来防止Web应用程序中的脚本漏洞利用。
这不是非常糟糕的建议吗?我的意思是,一个开发者可以通过curl或类似的东西发送HTML,然后HTML将被编码发送到服务器,这可能不是很好(?)
我在这里遗漏了什么或者误解了陈述吗?
答案 0 :(得分:5)
微软的判决没有错,但另一方面远未完成,他们的判决很危险。
因为默认情况下,validateRequest == true,所以你确实应该在客户端编码特殊的HTML字符,以便它们首先进入服务器并绕过validateRequest。
但是 - 他们应该强调,这肯定是不是服务器端过滤和验证的替代。
具体来说,如果您必须接受HTML,最强烈的建议是使用白名单而不是黑色过滤(即允许非常特定的HTML标记并消除所有其他标记)。强烈建议使用Microsoft AntiXSS library进行强大的用户输入过滤。它比自己“重新发明轮子”要好得多。
答案 1 :(得分:3)
我认为建议不好......
根据我的经验,我完全同意你的想法,并用以下内容取代建议:
答案 2 :(得分:1)
我永远不会相信客户端发送可信数据。正如您所说,提交数据的方式太多了。即使是非恶意用户,如果他们禁用了JavaScript,也可以绕过客户端上的系统。
然而,在link from that item上,第3点的含义变得清晰:
您可以通过以下方式帮助防止脚本攻击:
对表单变量query-string执行参数验证 变量和cookie值。此验证应包括两种类型 验证:验证变量可以转换为 期望的类型(例如,转换为整数,转换为 日期时间等,以及对预期范围或 格式。例如,一个表格post变量 应使用Int32.TryParse方法检查整数以进行验证 变量确实是一个整数。此外,得到的整数 应检查以验证该值是否在预期范围内 价值观。
在将值写回时,将HTML编码应用于字符串输出 回应。这有助于确保任何用户提供的字符串输入 将在浏览器中呈现为静态文本而不是可执行文件 脚本代码或解释的HTML元素。
HTML编码使用HTML保留字符转换HTML元素 它们是显示而不是执行。
我认为这只是一个错位字的情况,因为您无法在客户端上执行此级别的验证,并且在链接中包含的示例中显然是服务器端代码,而没有提及客户端。 修改强> 您还默认启用了请求验证吗?很明显,就微软而言,保护内容的重点是在服务器上。
答案 3 :(得分:0)
我认为这篇文章的作者是错误的。如果您转到链接的网页,它会在将数据发送回客户端之前进行编码,而不是相反。我认为这只是作者的一个编辑错误,他打算说相反..在它返回客户端之前对其进行编码。