微软最近(2011年12月29日)发布了一个更新,以解决网络中的几个严重安全漏洞.NET框架.MS11-100引入的其中一个修复暂时缓解了涉及哈希表冲突的潜在DoS攻击.这个修复程序似乎会 destruct 包含大量帖子数据的页面.在我们的例子中,在有非常大的复选框列表的页面上.为什么会这样?

一些非官方来源似乎表明,MS11-100对回发项目设置了500个的限制.我找不到微软的消息来源来证实这一点.我知道视图状态和其他框架特性消耗了这一限制.是否有任何配置设置来控制此新限制?我们可以不使用复选框,但它在我们的特定情况下工作得相当好.我们还想贴上这个补丁,因为它可以抵御其他一些有害的东西.

Unofficial source discussing the 500 limit:

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

编辑:带有limit示例的源代码(看起来是1000,而不是500)

@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:由于当前错误,操作无效

推荐答案

try 在web.config中添加此设置.我刚刚使用ASP.NETMVC2项目在.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();
}

如果它在网上找不到价值.配置文件,它会将其设置为System.Web.Util.AppSettings.EnsureSettingsLoaded分之System.Web.Util.AppSettings.EnsureSettingsLoaded0(内部静态类):

 _maxHttpCollectionKeys = 0x3e8;

此外,阿列克谢·古萨罗夫(Alexey Gusarov)两天前也在推特上谈到了这种情况:

here是一个Q&;与Jonathan Ness(MSRC安全开发经理)和Pete Voss(Trusty Computing高级响应通信经理)的交流:

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

A:是的,是的.

Asp.net相关问答推荐

Swashbuckle 通过 .NET 应用程序中的 XML 注释使用格式标识符

使用 Asp.Net MVC 和 KnockoutJS 处理日期

创建项目 ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 有什么区别

将 NUnit 添加到 ASP.NET MVC 测试框架的选项中

EntityFramework 通过 ID 获取对象?

iframe.readyState 在 chrome 中不起作用

我应该使用字节还是整数?

如何在asp.net中判断会话是否过期

如何在页面的基类中执行 Page_Load()?

在不知道键名的情况下访问 JSON 对象的元素

DBContext.Entry 有什么作用?

无法共同创建探查器错误 - 但未使用探查器

不能在 DropDownList 中 Select 多个项目

如何将数据集转换为数据表

asp.net 网站上的第一页加载缓慢

覆盖静态方法

如何从 ASP.NET Identity 获取用户列表?

ModalPopupExtender OK 按钮单击事件未触发?

Application_End global.asax

如何使用实体框架执行原始 SQL 查询而无需使用模型?