0

現時点では 2 つのコントローラー アクションがあります。1 つは一意の識別子に基づいて厳密に型指定されたビューを表示するアクションで、もう 1 つはモデルを変更するアクションです。私が何を意味するかを視覚化するためのコードを次に示します。

[HttpGet]
[ActionName("Edit")]
public ActionResult UpdateDevice(string code)
{
    // Request the device based on the code.
    var device = GetDeviceModel(code);

    // Present the device in a view.
    return View(device);
}

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
}

コードはデバイスを識別しますが、変更することもできます。それが私の問題です: post メソッド内では、 を使用して新しいコードにアクセスできますが、古いコードを変更できるようにするためには、古いmodel.Codeコードも知る必要があります。

いくつかの代替手段を試しましたが、どれも私の要件を満たしていませんでした。

  • ViewDataポストまで永続化されません。
  • TempDataセッションまたは Cookie に基づいていますが、現時点ではどちらも使用したくありません。
  • 非表示のフィールドとモデル バインディングは、クライアント側で操作できるため、オプションではありません。

最後に、次のようにクエリ文字列からデータを要求しようとしました。

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
    var oldCode = Request.QueryString["code"];
}

そして、これはうまくいきます!しかし、ウェブ上でこれに関するリソースは見つかりませんでした。だから私の質問は次のとおりです:投稿アクション内でクエリ文字列を使用すると、変更に対して安全ですか? そして、これが機能するための条件は何ですか(もしあれば)?

これがコードを「覚える」ための有効な方法でない場合、代替手段はありますか?

4

3 に答える 3

0

GET または POST リクエストを介して送信されたものは、変更されても安全ではありません。GET クエリ文字列は明らかに簡単に変更できますが、POST 変数を偽装するのにもそれほど労力はかかりません。アプローチを再考する必要があるように思えます。

パーミッション チェックをサーバー側で行って、ユーザーが渡された (古い) コードでデバイスを更新できるかどうかを判断するのが最適です。アクセス許可がない場合は、HTTP 550 コードなどのエラーを返します。

このアプローチを本当にサポートできない場合は、他の人が提案したように「OldCode」フィールドを DeviceModel クラスに追加することをお勧めしますが、クライアントに送信する前に暗号化します。次に、それを非表示フィールドに安全に書き込み、ユーザーが値を変更することを恐れずにサーバーで復号化できます。

于 2013-10-17T14:17:46.560 に答える
0

質問で言及された要件に基づいて、ケースの安全性を探しているようです。したがって、それQueryStringは安全ではないと言えます。私の意見Sessionでは、変数を使用することは、重要なデータを安全な場所に保管するための適切な方法です。このような方法を使用できます

[HttpGet]
[ActionName("Edit")]
public ActionResult UpdateDevice(string code)
{
    Session["code"] = code;
    ....
}

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
    if (Session["code"] == null)
       throw new Exception("Error Message.");
    var code = Session["code"].ToString();
    ....
    Session["code"] = null;
}      
于 2013-10-17T13:22:20.477 に答える