[asp.net] ASP.NET MS11-100 : 게시 된 최대 양식 값 수에 대한 제한을 어떻게 변경할 수 있습니까?

Microsoft는 최근 (12-29-2011) .NET Framework의 몇 가지 심각한 보안 취약점을 해결하기위한 업데이트를 발표했습니다. MS11-100에 의해 도입 된 픽스 중 하나는 해시 테이블 충돌과 관련된 잠재적 인 DoS 공격을 일시적으로 완화합니다. 이 수정 프로그램은 많은 POST 데이터가 포함 된 페이지를 손상시킵니다. 이 경우 매우 큰 확인란 목록이있는 페이지에서. 왜 이런 경우입니까?

일부 비공식 출처는 MS11-100이 포스트 백 품목에 500을 제한한다는 것을 나타냅니다. 이를 확인하는 Microsoft 소스를 찾을 수 없습니다. View State 및 기타 프레임 워크 기능 이이 한계 중 일부를 차지한다는 것을 알고 있습니다. 이 새로운 제한을 제어하는 ​​구성 설정이 있습니까? 우리는 확인란을 사용하지 않아도되지만 특정 상황에서는 잘 작동합니다. 또한 다른 불쾌한 것들로부터 보호하기 때문에 패치를 적용하고 싶습니다.

500 개의 한도를 논의하는 비공식 출처 :

이 게시판은 단일 HTTP POST 요청에 대해 제출할 수있는 변수의 수를 제한하여 DOS 공격 경로를 수정합니다. 기본 제한은 500이며 일반적인 웹 응용 프로그램에는 충분하지만 독일 보안 연구원의 설명에 따라 공격을 중화 할 수있을 정도로 낮습니다.

편집 : 한계 예제가있는 소스 코드 (500이 아닌 1,000으로 나타남) 표준 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에서 이것을 테스트 했으며이 설정으로 코드가 throw되지 않습니다.

<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 파일에서 값을 찾지 못하면 1000 System.Web.Util.AppSettings.EnsureSettingsLoaded(내부 정적 클래스)으로 설정합니다.

 _maxHttpCollectionKeys = 0x3e8;

또한 Alexey Gusarov는 이틀 전에이 설정에 대해 트윗했습니다.

그리고 여기 조나단 네스 (보안 개발 매니저, MSRC)와 피트 Voss이 (미스터 응답 커뮤니케이션 매니저, 신뢰할 수있는 컴퓨팅)와 Q & A에서 공식적인 답변은 다음과 같습니다

Q : AppSettings.MaxHttpCollectionKeys는 최대 양식 항목 수를 포함하는 새 매개 변수입니까?

A : 그렇습니다.


답변

여전히 .NET 1.1을 사용하는 사용자의 경우이 설정은 web.config를 통해 구성되지 않습니다. 레지스트리 설정입니다 (Reflector를 통해 답을 찾은 것과 같은 방식으로 만 발견했기 때문에 michielvoo의 팁). 아래 예제 MaxHttpCollectionKeys는 32 비트 버전의 Windows에서 5000으로 설정 됩니다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

64 비트 Windows 에디션의 경우 Wow6432Node에서 키를 설정하십시오.

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.config 수정 문제를 바로 적용하는 대신 먼저 코드 최적화를 살펴볼 수 있습니다.

소스보기를보고 1000 개 이상의 viewstate 숨겨진 필드를 찾으면 문제가 있습니다.


답변

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);
    }
}

우리가보고있는 것은 2 시간 동안 웹 사이트가을 던지기 시작할 때까지 점점 느리고 버그가 많다는 것 InvalidOperationExcpetion입니다. 그런 다음 앱 풀을 재활용하면 몇 시간 동안 문제가 해결됩니다.


답변