0

私はこれを理解しようとするのにしばらく時間がかかりました!
一般的に:フォームから「読み取り専用、非表示」のプロパティを取得したい。

例から不必要なものをすべて削除しました:
私は次のモデルを持っています

public class ChangeOrderDetailModel
{
...
...
    [ReadOnly(true)]
    public int OrderId { get; set; }
}

そしてビューで:

@using (Html.BeginForm("SubmitChangeOrder", "Order"))
{
    @Html.AntiForgeryToken()<br/>
    @Html.HiddenFor(o => o.OrderId) <br />
...
...
}

今:

  1. View HTML には、OrderID の非表示フィールドがあります...

  2. セキュリティ上の問題が発生する可能性があるため、だれにも「OrderID」を変更してほしくありません。

  3. フォーム送信時に OrderID 番号が必要です...

  4. 問題フォームがコントローラーに送信されると、 常に = 0OrderController.SubmitChangeOrder(ChangeOrderDetailModel mdl){}
    であることがわかります。mdl.OrderID

  5. プロパティから属性を削除するとReadOnly(true)、すべて正常に動作しますが、単純な JS を使用してフィールドの値を変更できるのは非常に悪いことです。
    そして、ハッシュトークンだけでリレーしたくないので、簡単に壊れてしまいます:(

なぜこのように機能するのですか?
好きなことを達成するためのより良い方法はありますか?

注: 複数の変更命令が並行して進行している可能性があるため、セッションには問題があります。

ありがとうございます。

4

1 に答える 1

1

[Readonly(true)] を使用することで、フィールドをモデルのプロパティにバインドしないようにモデル バインダーに明示的に指示します。を使用してプロパティをレンダリングすることによりHtml.HiddenFor、レンダリングされた html で必要なものが既に達成されています。コントローラー アクションに 2 番目のパラメーターを含めることができint OrderId、モデル バインダーは値をその変数にバインドします。

不正なユーザーが OrderId を編集できる可能性があります。このようなアクションから保護する 1 つの方法は、OrderId を暗号化し、暗号化された値をモデルとその後のページで使用することです。その後、ポストバックが発生したら、暗号化された OrderId を復号化します。暗号化と復号化は、モデル自体にカプセル化できます

@TomerW、あなたの質問を正しく理解していれば、あなたの中心的な問題は、悪意のあるユーザーがクライアント側で OrderId の値を変更できることです。私の提案は、OrderId をそのままの形でレンダリングするのではなく、サーバー側でサーバーでのみ認識されるキー。暗号化された値を HTML で非表示のフィールドとしてレンダリングする必要があります。不正なユーザーが関連付けられた値を変更しようとする可能性はありますが、復号化は失敗し、誰かがあなたの値をいじろうとしたことがわかります。以下はスタブの実装です。

public class ChangeOrderDetailModel
{
    [ReadOnly(true)] /*You are instructing the model binder not to bind this value*/
    public int OrderId { get; set; }

    private string _OrderIdEnc;
    public string OrderIdEnc
    {
        /*Encryp*/
        get
        {
            return Encrypt(OrderId);
        }

        set
        {
            _OrderIdEnc = value;
        }
    }

    public void DecryptPayload()
    {
        /* Decrypt, and this will fail is someone has edited the value */
        OrderId = Decrypt(_OrderIdEnc);
    }
}

ビュー モデルでは、 を使用します@Html.HiddenFor(o => o. OrderIdEnc)。標準の Windows 暗号を使用して、暗号化と復号化を行うことができます。

非常に安全にするために、要求/応答セッションごとに異なるキーを使用できます。これにより、より高度な悪意のあるユーザーが OrderIdEnc を古いバージョンに置き換えるのを防ぐことができます。

他の解決策があるかもしれないと確信していますが、上記は私が何度も使用して機能したパターンです

乾杯

于 2013-02-02T14:03:11.643 に答える