я иметь следующий вид редактирования, который содержит скрытое поле, которое содержит идентификатор объекта: -Что более безопасно передать идентификатор объекта как скрытое поле в форме или передать его в самом запросе
@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 является более безопасным (если таковые имеются) пропускание идентификатор объекта в качестве скрытого поля или передачи его от Html.ActionLink
? BR
Edit: - я проверить, если пользователь, который будет редактировать объект является 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 });
}
}
какой вид «зияющей дыры» приложение пострадает, если я не проверю идентификатор? и какую проверку я могу выполнить для проверки идентификатора на сервере (нет подтверждения для проверки)? –
@john, обычно, когда у вас есть идентификатор, текущий пользователь должен иметь возможность просматривать страницу только для * этого конкретного идентификатора *. Если они могут изменить его (и они могут изменить его, используя любой метод, который вы пытаетесь использовать), то они могут изменить его на некоторый идентификатор, для которого у них нет доступа, потенциально просматривая (и даже редактируя!) Данные, которые у них не должно быть доступа к. Это дыра в безопасности. –
Я проверяю, будет ли пользователь, который отредактирует объект, IsManagedBy (User.Identity.Name) перед обновлением объекта, как показано в моем выше сообщении. –