用户可以在动作参数中破解值吗?

时间:2014-07-09 17:10:20

标签: asp.net-mvc

示例:

我有表订单和表OrderPositions。

public partial class Orders
{
    public Orders()
    {
        this.OrderPositions = new HashSet<OrderPositions>();
    }

    public int OrderId { get; set; }
    public string Title { get; set; }

    public virtual ICollection<OrderPositions> OrderPositions { get; set; }
}

public partial class OrderPositions
{
    public int OrderPositionId { get; set; }
    public int OrderId { get; set; }
    public string Name { get; set; }

    public virtual Orders Orders { get; set; }
}

在视图用户可以修改OrderPositions 表中的单个记录。 在控制器中:

[HttpPost]
public ActionResult Edit(OrderPositions orderPosition)
{
   // save orderPosition
}

因此参数orderPosition.Orders应为= null,因为在视图中的表单上,用户只能修改订单位置。但用户可以破解它吗?我的意思是在参数orderPosition.Orders赢得了null并且我不仅在表OrderPositions中更新记录,而且还在表Orders中更新记录?或ASP.NET MVC阻止这种情况?

3 个答案:

答案 0 :(得分:3)

是的,他们可以。这是我不将我的实体作为参数暴露给动作方法的一个原因,而是使用仅具有我期望的属性的DTO。

这是Mass Assignment Vulnerability

的示例

答案 1 :(得分:3)

这真的取决于你在这里做什么

[HttpPost]
public ActionResult Edit(OrderPositions orderPosition)
{
   // save orderPosition
}

如果您要保存整个实体,那么没有什么能阻止用户通过添加实体属性。有几种方法可以防止这种情况,这里有一对......

1.在保存时创建新实体

[HttpPost]
public ActionResult Edit(OrderPositions orderPosition)
{

   if(ModelState.IsValid)
   {
       var order = new OrderPositions
       {
          OrderPositionId = orderPosition.OrderPositionId,
          OrderId = orderPosition.OrderId,
          Name = orderPosition.Name
       };

       //Then save this new entity
   }
}

2.创建特定于实体行为的模型

public class EditOrderPosition
{
    [Required]
    public int PositionId { get; set; }
    [Required]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }

}

[HttpPost]
public ActionResult Edit(EditOrderPosition model)
{

   if(ModelState.IsValid)
   {
       var order = new OrderPositions
       {
          OrderPositionId = model.PositionId,
          OrderId = model.Id,
          Name = model.Name
       };

       //Then save this new entity
   }
}

我通常使用第二种方法,因为它会阻止用户直接参与我的实体。根据经验,我从不将实体对象用作控制器动作中的参数。

希望这有帮助

答案 2 :(得分:2)

是的,没有什么可以阻止恶意应用使用任意数据调用您的端点。始终验证服务器端的所有内容。