無効なドロップダウンリストが動的にページに表示される場合でも、Firebugまたは別のツールを使用して、送信された値を改ざんし、「無効な」HTML属性を削除することができます。このコード:
protected override void OnLoad(EventArgs e) {
var ddlTest = new DropDownList() {ID="ddlTest", Enabled = false};
ddlTest.Items.AddRange(new [] { new ListItem("Please select", ""), new ListItem("test 1", "1"), new ListItem("test 2", "2") });
Controls.Add(ddlTest);
}
このHTMLがレンダリングされます。
<select disabled="disabled" id="Properties_ddlTest" name="Properties$ddlTest">
<option value="" selected="selected">Please select</option>
<option value="1">test 1</option>
<option value="2">test 2</option>
</select>
この問題は、Firebugを使用して「無効」属性を削除し、選択したオプションを変更すると発生します。
フォームの送信とフィールドの再作成時に、新しく生成されたコントロールはOnLoadの終了までに正しい値になりますが、OnPreRenderによって、送信されたコントロールのIDを想定し、送信されたフォームの値が与えられます。
.NETには、フィールドが元々無効な状態で作成され、送信された値が偽造されたという事実を検出する方法がないようです。無効な属性を削除できる正当なクライアント側の機能が存在する可能性があるため、これは理解できます。
ブルートフォースアプローチ以外に、このフィールドの値が変更されるべきではなかったことを検出する方法はありますか?
総当たり攻撃のアプローチは、OnLoadにある間に正しい値をどこかに保存したり、OnPreRenderで値を復元したりするなど、くだらないものだと思います。一部のフィールドは他のフィールドに依存しているため、それは私には受け入れられません。