Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MS11-100:如何更改已发布表单值的最大数量限制?_Asp.net_Post_Ms11 100 - Fatal编程技术网

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

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。我找不到微软的消息来源来证实这一点。我知道视图状态和其他框架特性占用了一些限制。是否存在控制此新限制的任何配置设置?我们可以不使用复选框,但它对

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两天前在推特上发布了关于此设置的消息:

这是Jonathan Ness(MSRC安全开发经理)和Pete Voss(Trusty Computing高级响应通信经理)在问答中的正式回答:

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

A:是的


对于那些仍在使用.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