2

我目前正在 MVC4 中创建一些用户配置文件编辑表单,并且为了测试,我将 UserId 属性呈现为表单上的只读文本框,如下所示:

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

当我接近完成编辑表单时,我删除了这个文本框,因为它只是用完房地产。完成此操作后,保存时发送回控制器的模型具有整数默认值 0,然后实体框架因无法更新任何行而崩溃。所以我在表格中添加了这个:

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

这是一个安全的举动吗?我应该将 ViewBag 用于这样的事情吗?在个人资料详细信息页面上,我呈现了一个编辑按钮,如下所示:

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

这意味着 UserId 在链接中呈现。这是安全可靠的还是我需要重新考虑如何在 UI 中移动模型和 ID?

TIA,

4

3 回答 3

2

这是一个安全的举动吗?

这将完成将 id 发送到服务器的工作。只需摆脱对readonly="readonly"隐藏输入几乎没有意义的属性。

我应该将 ViewBag 用于这样的事情吗?

这在安全性方面没有任何改变。任何用户仍然可以输入他想要的任何 id。无论您使用隐藏字段还是 ActionLink,您仍然将 id 作为纯文本发送到服务器,任何人都可以伪造请求并输入他想要的任何 id。因此,如果您的站点使用某种形式的身份验证,则在尝试对其执行任何操作之前,您必须在服务器端绝对检查您实际收到的 id 是属于当前经过身份验证的用户的资源。否则,一些经过身份验证的用户可以提供属于另一个用户的资源的 id 并能够更新它。当然,这只是一个假设的场景,完全不清楚这是否是您的情况以及是否id需要保护。

于 2012-10-11T10:53:06.867 回答
1

如果 UserId 是敏感的,那么还有其他选项

  • 仅使用 Session 状态保持UserId服务器端(如果您的架构允许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 回答