196

Microsoftは最近(2011年12月29日)、.NETFrameworkのいくつかの重大なセキュリティの脆弱性に対処するための更新プログラムをリリースしました。MS11-100によって導入された修正の1つは、ハッシュテーブルの衝突を含む潜在的なDoS攻撃を一時的に軽減します。この修正により、多くのPOSTデータを含むページが破損するようです。私たちの場合、非常に大きなチェックボックスリストがあるページ。なぜそうなるのでしょうか?

一部の非公式の情報源は、MS11-100がポストバックアイテムに500の制限を課していることを示しているようです。これを確認するMicrosoftのソースが見つかりません。ビューステートやその他のフレームワーク機能がこの制限の一部を使い果たしていることを私は知っています。この新しい制限を制御する構成設定はありますか?チェックボックスの使用を切り替えることもできますが、特定の状況ではかなりうまく機能します。また、他の厄介なものから保護するため、パッチを適用したいと思います。

500の制限について議論している非公式の情報源:

このセキュリティ情報は、単一のHTTP POSTリクエストに対して送信できる変数の数に制限を設けることにより、DOS攻撃ベクトルを修正します。デフォルトの制限は500です。これは、通常のWebアプリケーションには十分ですが、ドイツのセキュリティ研究者が説明しているように、攻撃を無力化するには十分に低い値です。

編集:制限の例を含むソースコード(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)+111System.Web
。 HttpRequest.FillInFormCollection()+307

4

5 に答える 5

277

この設定をweb.configに追加してみてください。ASP.NET MVC2プロジェクトを使用して.NET4.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();
}

web.configファイルで値が見つからない場合は、System.Web.Util.AppSettings.EnsureSettingsLoaded(内部静的クラス)で1000に設定されます。

 _maxHttpCollectionKeys = 0x3e8;

また、AlexeyGusarovは2日前にこの設定についてツイートしました。

そして、これがJonathan Ness(MSRCのセキュリティ開発マネージャー)とPete Voss(信頼できるコンピューティングのシニアレスポンスコミュニケーションマネージャー)とのQ&Aからの公式の回答です。

Q:AppSettings.MaxHttpCollectionKeysは、フォームエントリの最大数を含む新しいパラメータですか?

A:そうです。

于 2011-12-30T22:58:29.643 に答える
18

まだ.NET1.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

64ビットWindowsエディションの場合、Wow6432Nodeの下にキーを設定します。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388
于 2012-01-03T19:47:50.533 に答える
4

奇妙さを見ている人々のために、ここに私の$0.02を追加したいと思います。

アプリケーションがページ情報をASP.NETViewStateに隠し、Webサーバーのしきい値を超えると、この問題が発生します。web.config修正の問題をすぐに適用するのではなく、最初にコードの最適化を検討することをお勧めします。

ソースを表示し、1000以上のビューステートの非表示フィールドを探すと、問題が発生します。

于 2012-01-10T19:01:36.410 に答える
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);
    }
}

私たちが目にしているのは、2、3時間の間に、Webサイトが徐々に遅くなり、バグが増えて、がスローされ始めるまでのことInvalidOperationExcpetionです。次に、アプリプールをリサイクルします。これにより、問題がさらに数時間修正されます。

于 2012-01-06T17:40:56.620 に答える
1

ASP.NET COREを使用している場合は、Startup#ConfigureServices内でこの設定を設定できます

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

参照: StackOverflow

于 2020-12-15T20:10:59.357 に答える