2

現在、MVC4 でいくつかのユーザー プロファイル編集フォームを作成しており、テストのために、次のようなフォームの読み取り専用テキスト ボックスに UserId プロパティをレンダリングしていました。

<li>
    @Html.LabelFor(model => model.UserId)
    @Html.TextBoxFor(model => model.UserId, new { @readonly="readonly"})
</li>

編集フォームの完成が近づいてきたので、このテキストボックスを削除しました。これを行うと、保存時にモデルがコントローラーに送り返され、整数のデフォルト値が0になり、行を更新できないためEntity Frameworkが爆発します。だから私はこれをフォームに追加しました:

<li>
    @Html.HiddenFor(model => model.UserId, new { @readonly="readonly"})
</li>

これは安全な動きですか?このようなものに ViewBag を使用する必要がありますか? プロファイルの詳細ページで、次のような編集ボタンをレンダリングします。

@Html.ActionLink("Edit", "Edit", new { id=Model.UserId })

UserId がリンクでレンダリングされることを意味します。これは安全で安全ですか、それとも UI でモデルと ID を移動する方法を再考する必要がありますか?

ティア、

4

3 に答える 3

2

これは安全な動きですか?

これにより、IDがサーバーに送信されます。readonly="readonly"非表示の入力にはほとんど意味がない属性を削除するだけです。

このような目的でViewBagを使用する必要がありますか?

これはセキュリティの面では何も変わりません。どのユーザーも、好きなIDを入力できます。非表示フィールドを使用している場合でも、ActionLinkを使用している場合でも、IDをプレーンテキストとしてサーバーに送信しているため、誰でもリクエストを偽造して、必要なIDを入力できます。したがって、サイトで何らかの形式の認証を使用している場合は、サーバー側で、受信したIDが実際に現在認証されているユーザーに属するリソースであることを確認してから、アクションを実行する必要があります。そうしないと、認証されたユーザーが別のユーザーに属するリソースのIDを提供し、それを更新できる可能性があります。もちろん、これは単なる架空のシナリオであり、これがあなたのケースであるかどうか、そしてこれidを保護する必要があるかどうかはまったく明らかではありません。

于 2012-10-11T10:53:06.867 に答える
1

UserId が重要な場合は、他のオプションがあります

  • UserIdサーバー側のみを Session 状態に保つ(アーキテクチャがSessionを許可している場合)
  • 暗号化された Cookieに入れます。Darin によると、これらは危険にさらされる可能性があることに注意してください。

機密事項でない場合は問題ありませんHiddenFor。フォームの残りの部分と一緒に返送してください。これがルートの一部でない限り、ActionLink クエリ文字列に入れないでください (つまり、/Controller/Action/id)

于 2012-10-11T10:57:34.310 に答える
0

ValueInjecter を使用することを強くお勧めします。これは同じことを行うコードスニペットです

[HttpGet]
    public new ActionResult Profile()
    {
        var model = new ProfileModel();

        model.InjectFrom<UnflatLoopValueInjection>(this.GetCurrentUser());

        return View(model);
    }

    [HttpPost]
    public new ActionResult Profile(ProfileModel model)
    {
        if (ModelState.IsValid)
        {
            this.GetCurrentUser().InjectFrom<UnflatLoopValueInjection>(model);

            try
            {
                _userService.SaveOrUpdate(this.GetCurrentUser());
                TempData["Success"] = "User was successfully updated.";
                return RedirectToAction("Profile");
            }
            catch (Exception)
            {
                ModelState.AddModelError("Exception", "Unexpected error");
            }
        }

        return View(model);
    }

で、こんな景色が・・・

    @using (Html.BeginForm("Profile", "Account", FormMethod.Post, new { @class = "form-horizontal" }))
{
    @Html.ValidationSummary(true, "Unable to update profile. Please correct the errors and try again.", new { @class = "alert alert-block alert-error" })

    @Html.EditorForModel()

    <div class="form-actions">
        <input type="submit" value="Update" class="btn btn-primary" />
    </div>        
}
于 2012-10-11T11:13:43.183 に答える