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

col*_*ium 196 asp.net post ms11-100

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

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

讨论500限制的非官方消息来源:

该公告通过限制可以为单个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>
}
Run Code Online (Sandbox Code Playgroud)

此代码在补丁之前有效.以后它不起作用.错误是:

[InvalidOperationException:由于对象的当前状态,操作无效.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded()+82 System.Web.HttpValueCollection.FillFromEncodedBytes(Byte [] bytes,Encoding encoding)+111
System.Web. HttpRequest.FillInFormCollection()+307

Mic*_*out 275

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

<appSettings>
  <add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

这应该现在(在您应用安全更新后)更改限制.


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

在此输入图像描述

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

在此输入图像描述

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

if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
  throw new InvalidOperationException();
}
Run Code Online (Sandbox Code Playgroud)

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

 _maxHttpCollectionKeys = 0x3e8;
Run Code Online (Sandbox Code Playgroud)

此外,Alexey Gusarov两天前发布了关于此设置的推文:

这里是从Q&A与乔纳森·内斯(安全开发经理,MSRC)和皮特·沃斯(高级响应通信经理,可信赖计算)的官方的回答:

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

答:是的.

  • 精彩.这些是让我喜欢stackoverflow的答案 (25认同)
  • 它确实有帮助,我希望我有另一个帐户,以便我可以给+2 :) (4认同)

小智 18

对于那些仍然使用.NET 1.1的人来说,这个设置不是通过web.config配置的 - 它是一个注册表设置(对michielvoo来说,因为我只是通过Reflector发现这个,就像他找到答案一样).以下示例MaxHttpCollectionKeys在32位版本的Windows上设置为5000:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388
Run Code Online (Sandbox Code Playgroud)

对于64位Windows版本,请在Wow6432Node下设置密钥:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388
Run Code Online (Sandbox Code Playgroud)