1

無効なドロップダウンリストが動的にページに表示される場合でも、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で値を復元したりするなど、くだらないものだと思います。一部のフィールドは他のフィールドに依存しているため、それは私には受け入れられません。

4

6 に答える 6

2

これが本当に懸念事項である場合は、ページの最初のレンダリングでコントロールが無効に設定されたことを示す値をサーバーのどこかに(おそらくセッション内で)保持します。ページが投稿されたときにコントロールがまだ無効な状態になっていない場合は、フォームが改ざんされていることがわかります。

編集

無効にされたコントロールがフォームによって送信されることはなく、変更されたデータがサーバーに到達することはないため、これはクライアントの改ざんに対して安全です。http://w3.org/TR/html401/interact/forms.html#h-17.12を参照してください。

于 2010-04-06T05:48:27.333 に答える
1

安全なwebbアプリケーションを構築するための一般的なルール:クライアントからの入力を絶対に信用しないでください。セキュリティシステムを突破するために、各リクエストが手作りされていると仮定します。

安全な唯一のことは、無効化フィールドから戻ってくるデータを無視することです。そのデータは、セッションに保存するか、データベース(または使用するデータストレージ)から再ロードする必要があります。

于 2010-04-06T05:54:39.360 に答える
1

ViewStateを使用します。それは平均的なハッカーを止めるのに十分暗号化されています。

于 2010-04-06T08:09:17.820 に答える
1

いくつかの古い質問に戻ると、少なくとも1つの簡単なアプローチが存在することに気付きました。@MarkHurdが述べたようにページのビューステートを使用することです。

これは簡単なハックですが、次のようなものです。

    private const string defaultValue = "Hack me!"; // from original data source
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        ViewState[txtTest.ClientID] = false;
    }
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if(ViewState[txtTest.ClientID] != null && !(bool)ViewState[txtTest.ClientID])
            txtTest.Text = defaultValue;

        string x = txtTest.Text;
    }

この問題で何をしていたのかさえ思い出せません...とにかく、クライアントにレンダリングされなかった「本当に無効」を意味する.NET属性があればいいのですが。これが、このソリューションがハック近似を表すものだと思います。

于 2011-12-02T06:33:05.607 に答える
0

そのデータを処理しないでください。問題なく実行できます。いくつかの定数を表示している場合、それらはサーバー側に保存する必要があります。

于 2010-04-06T05:49:54.953 に答える
0

入力フィールドをラベルに置き換えます。

つまり、TextBoxまたはDropDownを無効にする代わりに、それらを非表示にしてラベルを表示するだけです。

于 2018-03-19T20:34:00.693 に答える