ASP.NETで、Postback時にチェックボックスの状態を変更しようとすると「'length' は Null またはオブジェクトではありません。」というエラーが発生しました。(チェックボックスがかなり多い画面です)
原因がわかったので、トラブルシュートの経緯を書き残しておきます。
MaxRequestLengthを超えてしまっているのでは?
最初に疑ったのは、ViewStateが大きすぎてMaxRequestLengthを超えてしまっているのでは?ということでした。
.NET 開発日記 » Blog Archive » ビューステートが大きすぎて12031エラーが発生。
G社のSpreadツールを用いてCheckBox付の業務一覧を表示していたが、ある日Scriptエラーが発生し、ボタン操作が不能になるという問い合わせが来た ...
しかし、MaxRequestLengthの設定値を大きくしても、現象は変わりませんでした。
Requestに含まれるフォームキーの上限を超えているのが原因だった
次にエラーが出た状態で、画面遷移しようとしてみました。
すると、以下のエラーが発生しました。
Message:オブジェクトの現在の状態に問題があるため、操作は有効ではありません。 StackTrace: 場所 System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded() 場所 System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding) 場所 System.Web.HttpRequest.FillInFormCollection()
"ThrowIfMaxHttpCollectionKeysExceeded"という、わかりやすい名前のメソッドで例外がスローされていたので、このメソッド名で検索してみました。
そして、以下のフォーラムがヒットし、最終的にKBにたどり着きました。
URL にエンコードされたフォーム データが有効ではありません - Visual Basic - Visual Studio User Group
多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する
Microsoft セキュリティ更新プログラム MS11-100 は、HTTP 要求内のフォーム キー、ファイル、および JSON メンバーの最大数を 1000 に制限します。この変更のために、ASP.NET アプリケーションは、1000 を超えるこれらの要素を含む要求を拒否します。 ...
KBを読んで、Web.configに以下の設定を追加し、MaxHttpCollectionの上限を変更すればいいことが、わかりました。
<add key="aspnet:MaxHttpCollectionKeys" value="2000" />
詳細な説明
MaxHttpCollectionの上限は、hashdosと呼ばれる攻撃に対応するために配布されたセキュリティ更新で導入されたものです。
(1000という上限は攻撃に必要なパラメータ数を下回ります)
ほとんどのWebサーバーに影響するメジャーなサービス拒否脆弱性
ASP.NETのパッチは、12月29日に提供されている。このパッチは、デフォルトサービスポリシーのWindows Azureの顧客には自動的に適用される。このパッチは、単一のPOSTフォームフィールド数を、サービス拒否の攻撃に必要な数を下回る1,000に制限する。 ...
hashdosについて
hashdosについては、以下のサイトが詳しいです。
Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策 | 徳丸浩の日記
これによると、PHPをはじめとする多くのWebアプリケーション開発プラットフォームに対して、CPU資源を枯渇させるサービス妨害攻撃(DoS攻撃)が可能な手法が見つかったということです。この攻撃は、hashdos と呼ばれています。 ...
hasdos攻撃が成功した場合の影響について引用します。
DoS攻撃の最中はCPU資源が攻撃に割り振られてしまい、サービスの提供が困難になると考えられます。Apache Killerと異なり、メモリ資源が枯渇するわけではないので、攻撃がやめば直ちにサービスは回復するようです。
参考サイト
Mikeのプログラミング・メモ: ASP.NETのセキュリティパッチ適用でエラー「Operation is not valid...」が発生する場合の対処