我有以下编辑视图,其中包含一个包含对象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 });
}
}
答案 0 :(得分:1)
隐藏字段将呈现在POST请求的正文中。 POST主体使用SSL加密。
在使用SSL时,我不确定通过GET传递的路径是否已加密。需要注意的事情。
当然,如果您不使用SSL,那么这两种方法都不比另一种方法更安全。
答案 1 :(得分:1)
这是一个棘手的问题。这两种解决方案都没有提供任何安全性。如果您没有验证服务器上的ID,则无论使用哪种技术,都会出现漏洞。