将对象ID作为表单中的隐藏字段传递或在请求本身中传递它更安全

时间:2012-03-15 23:22:10

标签: model-binding

我有以下编辑视图,其中包含一个包含对象ID的隐藏字段: -

@model Elearning.Models.Class

@{
    ViewBag.Title = "Edit";
    }
@section scripts{
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/WordCount.js")" type="text/javascript"></script>
}
<h2>Edit123</h2>
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Class</legend>

  @Html.HiddenFor(model => model.ClassID)

        <div class="editor-label">
            @Html.LabelFor(model => model.ClassName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ClassName)
            @Html.ValidationMessageFor(model => model.ClassName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ManagedBy)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.ManagedBy, new { value = "FL", disabled = "disabled" })
            @Html.ValidationMessageFor(model => model.ManagedBy)
        </div>
        @Html.HiddenFor(model => model.Timestamp)
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to Class List", "Index")
</div>

此视图将使用以下链接呈现: -

@Html.ActionLink("Edit", "Edit", new { id = item.ClassID })

我的编辑操作方法签名如下所示,不会使用隐藏字段值: -

[HttpPost]
        public ActionResult Edit(int id, FormCollection colletion)
        {              
            Class c = elearningrepository.GetClass(id);
           //code does here

我也可以编写如下的动作方法,它接受隐藏字段的值: -

[HttpPost]
        public ActionResult Edit(int ClassID, FormCollection colletion)
        {              
            Class c = elearningrepository.GetClass(Classid);
           //code does here

那么哪个apprach更安全(如果有的话)将对象ID作为隐藏字段传递或从Html.ActionLink传递? BR

修改: - 我正在检查在更新对象之前编辑对象的用户是否为IsManagedBy(User.Identity.Name),如下所示: -

 [HttpPost]
        public ActionResult Edit(int id, FormCollection colletion)
        {

            Class c = elearningrepository.GetClass(id);
           if (!c.IsManagedBy(User.Identity.Name))
            {
                return View("Error");
           }
            try
            {
                if (TryUpdateModel(c))
                {
                   // elearningrepository.setmod(c);
                    elearningrepository.Save();
                    return RedirectToAction("Details", new { id = c.ClassID });
                }
            }

2 个答案:

答案 0 :(得分:1)

隐藏字段将呈现在POST请求的正文中。 POST主体使用SSL加密。

在使用SSL时,我不确定通过GET传递的路径是否已加密。需要注意的事情。

当然,如果您不使用SSL,那么这两种方法都不比另一种方法更安全。

答案 1 :(得分:1)

这是一个棘手的问题。这两种解决方案都没有提供任何安全性。如果您没有验证服务器上的ID,则无论使用哪种技术,都会出现漏洞。