ASP.NET MS11-100:如何更改已发布表单值的最大数量限制?
Microsoft最近(2011年12月29日)发布了一个更新,以解决.NET Framework中的几个严重安全漏洞。由引入的修复程序之一临时缓解了涉及哈希表冲突的潜在DoS攻击。似乎此修复程序会中断包含大量POST数据的页面。在我们的例子中,在有非常大的复选框列表的页面上。为什么会这样 一些非官方来源似乎表明MS11-100对回发邮件的限制为500。我找不到微软的消息来源来证实这一点。我知道视图状态和其他框架特性占用了一些限制。是否存在控制此新限制的任何配置设置?我们可以不使用复选框,但它对我们的特殊情况非常有效。我们也希望应用补丁,因为它可以防止一些其他讨厌的东西ASP.NET MS11-100:如何更改已发布表单值的最大数量限制?,asp.net,post,ms11-100,Asp.net,Post,Ms11 100,Microsoft最近(2011年12月29日)发布了一个更新,以解决.NET Framework中的几个严重安全漏洞。由引入的修复程序之一临时缓解了涉及哈希表冲突的潜在DoS攻击。似乎此修复程序会中断包含大量POST数据的页面。在我们的例子中,在有非常大的复选框列表的页面上。为什么会这样 一些非官方来源似乎表明MS11-100对回发邮件的限制为500。我找不到微软的消息来源来证实这一点。我知道视图状态和其他框架特性占用了一些限制。是否存在控制此新限制的任何配置设置?我们可以不使用复选框,但它对
通过提供对DOS攻击向量的限制,修复了DoS攻击向量。 可以为单个HTTP POST提交的变量数 要求默认限制为500,这应该足够正常使用 web应用程序,但仍然足够低,可以作为 由德国的安全研究人员描述
编辑:带有限制示例的源代码(显示为1000,而不是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>
}
@使用(Html.BeginForm())
{
@对于(变量i=0;i<1000;i++)
{
@复选框(“cb”+i.ToString(),true)
}
}
这段代码在补丁发布之前就已经运行了。之后就不行了。错误是:
[InvalidOperationException:由于当前错误,操作无效
对象的状态。]System.Web.HttpValueCollection.ThrowifMaxHttpCollectionKeysExcepended() +82 System.Web.HttpValueCollection.FillFromEncodedBytes(字节[]字节,编码编码)+111
System.Web.HttpRequest.FillInFormCollection()+307
尝试在web.config中添加此设置。我刚刚用ASP.NET MVC 2项目在.NET 4.0上进行了测试,使用此设置,您的代码不会抛出:
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>
如果在web.config文件中找不到该值,它将在System.web.Util.AppSettings.ensureResettingsLoaded
(内部静态类)中将其设置为1000:
另外,Alexey Gusarov两天前在推特上发布了关于此设置的消息:
对于那些仍在使用.NET 1.1的用户,此设置不是通过web.config配置的-它是一个注册表设置(对michielvoo来说是一个提示,因为我只是通过Reflector发现的,与他找到答案的方式相同)。下面的示例在32位版本的Windows上将
MaxHttpCollectionKeys
设置为5000:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388
对于64位Windows版本,请在WOW6432节点下设置密钥:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388
throwifmaxhttpcollectionkeysextended()
也已添加到System.Web.HttpCookieCollection
调用HttpCookieCollection.Get()
时,它会在内部调用HttpCookieCollection.AddCookie()
,然后它会通过调用调用,方法是通过调用
public HttpCookie Get(string name)
{
HttpCookie cookie = (HttpCookie) base.BaseGet(name);
if ((cookie == null) && (this._response != null))
{
cookie = new HttpCookie(name);
this.AddCookie(cookie, true);
this._response.OnCookieAdd(cookie);
}
return cookie;
}
internal void AddCookie(HttpCookie cookie, bool append)
{
this.ThrowIfMaxHttpCollectionKeysExceeded();
this._all = null;
this._allKeys = null;
if (append)
{
cookie.Added = true;
base.BaseAdd(cookie.Name, cookie);
}
else
{
if (base.BaseGet(cookie.Name) != null)
{
cookie.Changed = true;
}
base.BaseSet(cookie.Name, cookie);
}
}
我们所看到的是,在几个小时内,网站逐渐变慢,变得更加混乱,直到它开始抛出invalidoOperationException
。然后,我们回收应用程序池,这将在几个小时内解决问题。我只想在这里添加我的$0.02,让人们看到这种奇怪
如果应用程序将页面信息隐藏到ASP.NET ViewState中,并且超过web服务器阈值,则会遇到此问题。与直接应用web.config修复问题不同,您可能希望首先考虑优化代码
查看源代码,并查找1000多个viewstate隐藏字段,您就有问题了。如果您使用的是ASP.NET CORE,则可以在Startup#ConfigureServices中设置此设置
services.Configure<FormOptions>(options => options.ValueCountLimit = 1000); // you may want to adjust this limit
services.Configure(options=>options.ValueCountLimit=1000);//您可能需要调整此限制
参考:
做一些额外的跑腿工作,然后在上面特别写着“500”的地方贴出来。这就是问题所在。没有(来自Microsoft的)节。只是来自非官方的评论员,他们可能知道也可能不知道他们在谈论什么。我还是发布了一个链接和代码片段。@安德鲁:我能想到的唯一“多选列表”是SelectionMode设置为Multiple的列表框。这确实可能会发布多个值。然而,问题提到了“下拉列表”。让我们等待问题作者的任何评论。最近关于此主题的一个问题确定修复程序通过限制帖子数量减轻了DOS。有关此问题的详细信息,请参阅。太棒了。这些答案让我爱上了StackOverflow它真的很有帮助,我希望我有另一个帐户,这样我就可以给出+2:)这可以在applicationhost.config中为整个服务器更新吗?或machine.config?有没有办法在每页级别控制此限制?(同时询问和。)一些人建议查看网页,因为它不应该包含这么多表单字段。但是对于这个错误,我们有一个非常有效的场景——我们客户的一个电子商务站点中的购物车有很多物品,我们在她访问页面时记录了这个错误。在这种情况下,覆盖最大值是最好的选择。对于此安全性修复的DoS攻击,您是否知道5000是合理的安全值
public HttpCookie Get(string name)
{
HttpCookie cookie = (HttpCookie) base.BaseGet(name);
if ((cookie == null) && (this._response != null))
{
cookie = new HttpCookie(name);
this.AddCookie(cookie, true);
this._response.OnCookieAdd(cookie);
}
return cookie;
}
internal void AddCookie(HttpCookie cookie, bool append)
{
this.ThrowIfMaxHttpCollectionKeysExceeded();
this._all = null;
this._allKeys = null;
if (append)
{
cookie.Added = true;
base.BaseAdd(cookie.Name, cookie);
}
else
{
if (base.BaseGet(cookie.Name) != null)
{
cookie.Changed = true;
}
base.BaseSet(cookie.Name, cookie);
}
}
services.Configure<FormOptions>(options => options.ValueCountLimit = 1000); // you may want to adjust this limit