Asp.net mvc .NET MVC防止伪造邮件
情况: 我有一个模型,基于用户角色,我希望允许用户只更新模型的某些部分。假设模型有三个字段。(我的模型显然比这更复杂) 我的观点是这样的:Asp.net mvc .NET MVC防止伪造邮件,asp.net-mvc,Asp.net Mvc,情况: 我有一个模型,基于用户角色,我希望允许用户只更新模型的某些部分。假设模型有三个字段。(我的模型显然比这更复杂) 我的观点是这样的: Html.TextBoxFor(@Model.Field1) Html.TextBoxFor(@Model.Field2) @if(UserIsAdmin()) Html.TextBoxFor(@Model.Field3) else @Model.Field3 public class FooController : Controller
Html.TextBoxFor(@Model.Field1)
Html.TextBoxFor(@Model.Field2)
@if(UserIsAdmin())
Html.TextBoxFor(@Model.Field3)
else
@Model.Field3
public class FooController : Controller
{
public ActionResult Add(FooViewModel viewModel)
{
if (ModelState.IsValid)
{
FooDataModel dataModel = FooMapper.MapToDataModel(viewModel, User);
FooRepository.Add(dataModel);
}
}
}
在语法方面(以及示例的糟糕设计),您可以看到我正在尝试做什么。当用户发布表单时,我的控制器只需获取MyObject并将其保存回数据库,我们使用的是EF
问题:
我的问题是,有没有办法阻止用户伪造帖子来保存他/她不应该保存的数据。我目前的想法是在控制器中进行检查,看看用户是否修改了不应该修改的值。或者我可以单独保存字段,但这两种方法都不方便
有更好的吗
谢谢
其他信息:
不确定这篇文章是否相关:
这三个字段都来自同一个数据库表,我使用EF获取并保存实体。使用一个viewmodel,它只接受应该更新的字段,然后用这些值填充模型。您可以使用类似的方法在两者之间进行映射。您希望确保用户只能更新允许的字段 您认为实现这一点的方法是防止用户使用firebug、F12开发工具或GreaseMonkey等工具“伪造”响应,并询问了如何做到这一点 但正确/最好的方法是检查用户正在尝试更新哪些字段,并且只更新允许他更新的字段。那么不管他们是否伪造请求,他们仍然无法访问任何他们不应该访问的内容。换句话说,在访问点检查访问权限 防伪令牌用于解决另一个问题,即XSRF 我目前的想法是在控制器中进行检查,看看用户是否修改了不应该修改的值。或者我可以单独保存字段,但这两种方法都不方便 你的想法是对的。典型的
Add()
操作如下所示:
Html.TextBoxFor(@Model.Field1)
Html.TextBoxFor(@Model.Field2)
@if(UserIsAdmin())
Html.TextBoxFor(@Model.Field3)
else
@Model.Field3
public class FooController : Controller
{
public ActionResult Add(FooViewModel viewModel)
{
if (ModelState.IsValid)
{
FooDataModel dataModel = FooMapper.MapToDataModel(viewModel, User);
FooRepository.Add(dataModel);
}
}
}
正如@VimalStan所说,您的FooViewModel
是一个只包含您希望让用户更新的字段的模型。此外,这仍然不能解决您的问题,应该在映射器中完成(在本例中为FooMapper
),并按照@Ben的建议检查每个字段:
public static class FooMapper
{
public static FooDataModel Map(FooViewModel viewModel, IPrincipal user)
{
var dataModel = new FooDataModel();
dataModel.Field1 = viewModel.Field1;
dataModel.Field2 = viewModel.Field2;
if (IsAllowedToUpdateField3(user))
{
dataModel.Field3 = viewModel.Field3;
}
return dataModel;
}
public static bool IsAllowedToUpdateField3(IPrincipal user)
{
return false; // your logic
}
}
那么,您是说阻止用户“伪造”响应不会阻止不希望的操作吗?我理解你说这不是最好的方法。回答我自己的问题,我想不是,因为用户可以使cookie和表单中的值匹配。