微软最近(12-29-2011)发布了一项更新,以解决.NET框架中的几个严重安全漏洞。MS11-100引入的修补程序之一暂时缓解了涉及哈希表冲突的潜在DoS攻击。这个补丁似乎破坏了包含大量POST数据的页面。在我们的例子中,页面上有非常大的复选框列表。为什么会是这样呢?
一些非官方来源似乎表明,MS11-100在回发项目上的限制为500。我找不到微软的消息来源来证实这一点。我知道View和其他框架特性消耗了其中的一些限制。是否有任何配置设置控制此新限制?我们可以不使用复选框,但是对于我们的特定情况,它工作得相当好。我们也想应用这个补丁,因为它可以防止其他一些讨厌的东西。
Unofficial source discussing the 500 limit:
公告通过限制为单个HTTP请求提交的变量数量来修正DOS攻击矢量。默认的限制是500,这对于正常的web应用程序来说应该足够了,但仍然很低,足以中和德国安全研究人员所描述的攻击。
编辑:带有限制示例(看起来是1,000,而不是500)的源代码创建了一个标准MVC应用程序,并将以下代码添加到主索引视图中:
@using (Html.BeginForm())
{
<fieldset class="fields">
<p class="submit">
<input type="submit" value="Submit" />
</p>
@for (var i = 0; i < 1000; i++)
{
<div> @Html.CheckBox("cb" + i.ToString(), true) </div>
}
</fieldset>
}此代码在修补程序之前工作。之后就不管用了。错误是:
InvalidOperationException:由于对象的当前状态,操作无效。
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded() +82 System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[]字节,编码编码) +111
System.Web.HttpRequest.FillInFormCollection() +307
发布于 2011-12-30 22:58:29
尝试在web.config中添加此设置。我刚刚用一个.NET MVC 2项目在ASP.NET 4.0上测试了这一点,在这个设置下,您的代码不会抛出:
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>现在(在您应用了安全更新之后)应该可以更改限制了。
我还没有更新我的机器,所以使用Reflector我检查了HttpValueCollection类,它没有ThrowIfMaxHttpCollectionKeysExceeded方法:

我安装了KB2656351 ( .NET 4.0的更新),重新加载了Reflector中的程序集,并出现了如下方法:

所以这个方法绝对是新的。我在Reflector中使用了反汇编选项,从代码中可以看出它检查了一个AppSetting:
if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
throw new InvalidOperationException();
}如果它找不到web.config文件中的值,它将在System.Web.Util.AppSettings.EnsureSettingsLoaded (内部静态类)中将其设置为1000:
_maxHttpCollectionKeys = 0x3e8;另外,Alexey Gusarov两天前在推特上提到了这一背景:
here是来自乔纳森·内斯(MSRC安全开发经理)和Pete (可靠计算高级响应通信经理)的正式问答:
Q: AppSettings.MaxHttpCollectionKeys是包含最大表单条目数的新参数吗?
A:是的。
发布于 2012-01-03 19:47:50
对于那些仍然使用.NET 1.1的人来说,这个设置不是通过web.config配置的--它是一个注册表设置(向michielvoo致敬,因为我是通过Reflector找到答案的方式发现的)。下面的示例将32位版本的MaxHttpCollectionKeys设置为5000:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388对于64位Windows版本,请在Wow6432Node下设置键:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388发布于 2012-01-10 19:01:36
我只想把我的0.02美元加在这里,让人们看到我的古怪之处。
如果应用程序将页面信息存储到ASP.NET ViewState中,并且超过了web服务器阈值,则会遇到此问题。与其立即应用web.config修复问题,不如先看看如何优化代码。
查看源代码,并查找1000+视图状态隐藏字段,您就会遇到问题。
https://stackoverflow.com/questions/8684049
复制相似问题