我的团队正在从 Windows Server 2003 和 IIS 6 上的 Coldfusion 8 迁移到 Windows Server 2008R2 和 IIS 7.5 上的 Coldfusion 10。
在我们针对 CF10 服务器的标准版本中,我们已将 POST 请求参数的最大数量默认值设为 100。但是,由于 server.log 中的错误显示以下内容,我的客户要求将限制提高到 3000 以上:
"Error","ajp-bio-8018-exec-2","06/17/14","10:40:46",,"POST parameters exceeds the maximum limit 100 specified in the server. You can modify the setting in Administrator Server Settings."
我想增加限制以安抚客户,但不要太高,以免影响应用程序环境和服务器上托管的其他应用程序的稳定性。将此设置增加到 5000 或更高会有什么后果?这是否也是 IIS 的缺点和限制?
谢谢。
答案1
考虑到之前没有限制。现在这样做的原因是为了解决与所有 Web 编程语言(而不仅仅是 ColdFusion)相关的严重安全问题。
他们可能有一些较大的表单,需要更高的设置。不要随意选择某个值,而是要求他们查看代码库并确定实际需要的发布参数的最大数量,然后提供一些填充值。
我在公司必须这样做,作为我们编码标准的一部分,我们对表单的大小进行了限制。如果出现新任务,需要的内容超出限制,则重新设计表单,使其内容小于限制。
本文解释了HashDos攻击,这也是这个设置的原因。
回顾一下 HashDos 漏洞
首先,我们需要了解此设置旨在保护的漏洞,即 HashDos。为此,我们需要再退一步,了解哈希算法的工作原理。当您在 ColdFusion 中的结构中存储某些内容时,例如 form["pete"],它将创建密钥的哈希值(在本例中为“pete”),它将该值哈希为整数,我们假设“pete”.hashCode() == 8
所有哈希算法都有可能产生冲突,即两个不同的字符串产生相同的哈希码。因此,假设“peter”.hashCode() == 8。您不希望 form["peter"] 返回 form["pete"] 的结果,因此哈希表会为每个整数代码创建一个存储桶。如果存储桶包含多个项目,则会比较存储桶中的每个项目(这很慢)。
由于这种碰撞比较非常慢,因此拒绝服务攻击的机会就来了。如果您可以构造一个导致数千次哈希碰撞查找的请求,则该请求可能需要几秒到几分钟才能处理。例如,对于大约 50,000 次碰撞,我的四核 Mac Pro(15 GB 内存)需要近 30 分钟才能处理该请求(总大小不到 2MB)。
HashDos 不仅仅涉及表单后变量
只要您在结构中存储大量密钥,就有可能发生 HashDOS。URL 范围也可能存在漏洞,但 Web 服务器通常会限制查询字符串的大小。另一个可能出现这种情况的地方是,如果您接受来自外部源的 Xml 或 JSON 字符串,然后将其解析为结构。因此,每当您接受可能产生结构密钥的外部输入时,请记住这一点。