[英]ASP.NET MS11-100: how can I change the limit on the maximum number of posted form values? value="10000000000" not working
[英]ASP.NET MS11-100: how can I change the limit on the maximum number of posted form values?
Microsoft 最近 (12-29-2011) 发布了一个更新以解决 .NET Framework 中的几个严重安全漏洞。 MS11-100引入的修复程序之一暂时缓解了涉及哈希表冲突的潜在 DoS 攻击。 此修复程序似乎破坏了包含大量 POST 数据的页面。 在我们的例子中,在具有非常大的复选框列表的页面上。 为什么会这样?
一些非官方来源似乎表明 MS11-100 对回发项目设置了 500 的限制。 我找不到确认这一点的 Microsoft 来源。 我知道 View State 和其他框架特性消耗了一些这个限制。 是否有任何配置设置可以控制此新限制? 我们可以不再使用复选框,但它对于我们的特定情况非常有效。 我们还想应用该补丁,因为它可以防止其他一些令人讨厌的事情。
该公告通过对可为单个 HTTP POST 请求提交的变量数量提供限制来修复 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[] bytes, Encoding encoding) +111
System.Web.HttpRequest.FillInFormCollection() +307
尝试在 web.config 中添加此设置。 我刚刚使用 ASP.NET MVC 2 项目在 .NET 4.0 上对此进行了测试,使用此设置您的代码不会抛出:
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>
现在应该可以(在您应用安全更新后)更改限制。
我还没有更新我的机器,所以使用 Reflector 我检查了 HttpValueCollection 类,它没有ThrowIfMaxHttpCollectionKeysExceeded
方法:
我安装了KB2656351 (.NET 4.0 的更新),在 Reflector 中重新加载了程序集,方法出现了:
所以这种方法绝对是新的。 我在 Reflector 中使用了Disassemble选项,从代码中可以看出它检查了一个 AppSetting:
if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
throw new InvalidOperationException();
}
如果在 web.config 文件中找不到该值,它将在System.Web.Util.AppSettings.EnsureSettingsLoaded
(内部静态类)中将其设置为 1000:
_maxHttpCollectionKeys = 0x3e8;
此外,阿列克谢·古萨罗夫两天前在推特上提到了这个设置:
而这里是从Q&A与乔纳森·内斯(安全开发经理,MSRC)和皮特·沃斯(高级响应通信经理,可信赖计算)的官方的回答:
问:AppSettings.MaxHttpCollectionKeys 是包含最大表单条目数的新参数吗?
答:是的。
对于那些仍在使用 .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版本,设置Wow6432Node下的key:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388
我只想在这里添加我的 0.02 美元,让人们看到奇怪的东西。
如果您的应用程序将页面信息隐藏到 ASP.NET ViewState 中,并且超过了 Web 服务器阈值,您就会遇到这个问题。 与其立即应用 web.config 修复问题,不如先看看优化代码。
查看源代码,并查找 1000 多个视图状态隐藏字段,您就遇到了问题。
ThrowIfMaxHttpCollectionKeysExceeded()
也已添加到System.Web.HttpCookieCollection
。
看起来当HttpCookieCollection.Get()
被调用时,它在内部调用HttpCookieCollection.AddCookie()
,然后调用ThrowIfMaxHttpCollectionKeysExceeded()
。
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);
}
}
我们看到的是,在几个小时内,网站变得越来越慢和错误,直到它开始抛出InvalidOperationExcpetion
。 然后我们回收应用程序池,将问题再解决几个小时。
如果您使用的是 ASP.NET CORE,您可以在 Startup#ConfigureServices 中设置此设置
services.Configure<FormOptions>(options => options.ValueCountLimit = 1000); // you may want to adjust this limit
参考: StackOverflow
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.