ASP.NET MS11-100:如何更改已发布表单值的最大数量限制?

时间:2011-12-30 21:00:33

标签: asp.net post ms11-100

Microsoft最近(12-29-2011)发布了一个更新,以解决.NET Framework中的几个严重安全漏洞。 MS11-100引入的修复之一暂时缓解了涉及哈希表冲突的潜在DoS攻击。看来此修复程序会破坏包含大量POST数据的页面。在我们的例子中,在具有非常大的复选框列表的页面上。为什么会这样呢?

一些非官方消息来源似乎表明MS11-100对回发项目的限制为500。我找不到确认这一点的Microsoft源代码。我知道View State和其他框架功能会占用这个限制。是否有任何配置设置来控制此新限制?我们可以不使用复选框,但它对我们的特定情况很有效。我们也想应用补丁,因为它可以防止其他一些令人讨厌的东西。

Unofficial source discussing the 500 limit:

  

公告通过提供限制来修复DOS攻击向量   可以为单个HTTP POST提交的变量数   请求。默认限制为500,对于正常情况应该足够了   网络应用程序,但仍然足够低,以中和攻击   由德国安全研究人员描述。

编辑:带有限制示例的源代码(看起来是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(字节[]字节,编码编码)+111
  System.Web.HttpRequest.FillInFormCollection()+307

4 个答案:

答案 0 :(得分:275)

尝试在web.config中添加此设置。我刚刚在.NET 4.0上使用ASP.NET MVC 2项目对此进行了测试,并且使用此设置,您的代码不会抛出:

<appSettings>
  <add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>

现在应该可以(在应用安全更新后)更改限制。


我还没有更新我的机器,所以使用Reflector我检查了HttpValueCollection类,它没有ThrowIfMaxHttpCollectionKeysExceeded方法:

enter image description here

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

enter image description here

所以这种方法绝对是新的。我在Reflector中使用了 Disassemble 选项,从我可以从代码中看出它检查AppSetting:

if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
  throw new InvalidOperationException();
}

如果在web.config文件中找不到该值,它会在System.Web.Util.AppSettings.EnsureSettingsLoaded(内部静态类)中将其设置为1000:

 _maxHttpCollectionKeys = 0x3e8;

此外,Alexey Gusarov两天前在推特上发布了这个设置:

here是Q&amp; A与Jonathan Ness(安全开发经理,MSRC)和Pete Voss(高级响应通信经理,可信赖计算)的正式答案:

  

问:AppSettings.MaxHttpCollectionKeys是否为新参数   包含表单条目的最大数量?

     

答:是的。

答案 1 :(得分:4)

我只想在这里添加我的0.02美元给那些看到奇怪的人。

如果您的应用程序将页面信息存入ASP.NET ViewState并超过Web服务器阈值,那么您将遇到此问题。而不是立即应用web.config修复问题,您可能希望首先考虑优化代码。

查看源代码,查找1000多个viewstate隐藏字段,您就遇到了问题。

答案 2 :(得分:3)

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。然后我们回收应用程序池,将问题再解决几个小时。

答案 3 :(得分:0)

如果您使用的是ASP.NET CORE,则可以在Startup#ConfigureServices中设置此设置

services.Configure<FormOptions>(options => options.ValueCountLimit = 1000); // you may want to adjust this limit

参考: StackOverflow