2012-03-15 1 views
0

я иметь следующий вид редактирования, который содержит скрытое поле, которое содержит идентификатор объекта: -Что более безопасно передать идентификатор объекта как скрытое поле в форме или передать его в самом запросе

@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 }); 
       } 
      } 

ответ

1

Скрытое поле будет получать воспроизводимые в теле запрос POST. Органы POST шифруются с помощью SSL.

Я не уверен, что путь, пройденный через GET, зашифрован при использовании SSL. Что-то посмотреть.

Конечно, если вы не используете SSL, то ни один из методов не является более безопасным, чем другой.

1

Это трюк. Ни одно из решений не предлагает никакой безопасности. Если вы не проверяете идентификаторы на сервере, у вас есть зияющая дыра, независимо от того, какой метод вы используете.

+0

какой вид «зияющей дыры» приложение пострадает, если я не проверю идентификатор? и какую проверку я могу выполнить для проверки идентификатора на сервере (нет подтверждения для проверки)? –

+0

@john, обычно, когда у вас есть идентификатор, текущий пользователь должен иметь возможность просматривать страницу только для * этого конкретного идентификатора *. Если они могут изменить его (и они могут изменить его, используя любой метод, который вы пытаетесь использовать), то они могут изменить его на некоторый идентификатор, для которого у них нет доступа, потенциально просматривая (и даже редактируя!) Данные, которые у них не должно быть доступа к. Это дыра в безопасности. –

+0

Я проверяю, будет ли пользователь, который отредактирует объект, IsManagedBy (User.Identity.Name) перед обновлением объекта, как показано в моем выше сообщении. –