1. ホーム
  2. asp.net

[解決済み] [Solved] ASP.NET MS11-100: 投稿されたフォームの値の最大数の制限を変更するにはどうしたらいいですか?

2022-04-16 07:16:28

質問内容

マイクロソフトは最近(2011年12月29日)、.NET Frameworkのいくつかの深刻なセキュリティ脆弱性に対処するための更新プログラムをリリースしました。 このアップデートで導入された修正の1つは MS11-100 ハッシュテーブルの衝突を伴うDoS攻撃の可能性を一時的に緩和しています。 この修正により、多くの POST データを含むページが壊れるようです。 私たちの場合は、非常に大きなチェックボックスリストを持つページで発生します。 なぜこのようなことが起こるのでしょうか?

いくつかの非公式な情報源は、MS11-100がpostbackアイテムに500という制限を設けていることを示しているようです。 これを確認するマイクロソフトのソースは見当たりません。 ビューステートと他のフレームワークの機能がこの制限の一部を食いつぶしていることは知っています。 この新しい制限を制御するコンフィギュレーション設定はあるのでしょうか? チェックボックスの使用から切り替えることもできますが、私たちの特定の状況にはむしろうまく機能しています。 また、このパッチは他の厄介なものから保護してくれるので、適用したいと思います。

500回制限についての非公式ソース。

<ブロッククオート

この速報は、DOS 攻撃のベクトルを修正するため、DOS の制限を提供します。 1つのHTTP POSTで送信可能な変数の数 リクエストに対応します。デフォルトの上限は500で、これは通常の ウェブアプリケーションで、この攻撃を無効にするにはまだ十分な低さです。 ドイツのセキュリティ研究者が述べています。

EDIT: 制限値(500ではなく1000のようです)の例を記載したソースコード 標準的な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にこの設定を追加してみてください。.NET 4.0のASP.NET MVC 2プロジェクトでテストしたところ、この設定によってコードがスローされなくなりました。

<appSettings>
  <add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>

これで(セキュリティアップデートを適用した後)制限を変更することができるはずです。


まだマシンをアップデートしていなかったので、Reflectorを使ってHttpValueCollectionクラスを確認したところ、そのクラスには ThrowIfMaxHttpCollectionKeysExceeded メソッドを使用します。

インストールした KB2656351 (.NET 4.0 の更新) を行い、Reflector でアセンブリを再読み込みしたところ、メソッドが表示されました。

だから、その方法は間違いなく新しいものです。私が使ったのは ディスアセンブル というオプションがあり、コードからわかることは、AppSettingをチェックしていることです。

if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
  throw new InvalidOperationException();
}

web.config ファイルにこの値がない場合は System.Web.Util.AppSettings.EnsureSettingsLoaded (内部の静的クラス)。

 _maxHttpCollectionKeys = 0x3e8;


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

そして こちら は、Jonathan Ness (Security Development Manager, MSRC) と Pete Voss (Sr. Response Communications Manager, Trustworthy Computing) との Q&A による正式な回答です。

<ブロッククオート

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

A: はい、そうです。