控制器:
[HttpGet]
public ActionResult Edit(int id)
{
var obj = _uow.User.Get(id);
if (obj.Name != User.Identity.Name) //validate
{
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
}
return View(obj);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(UserViewModel model)
{
var obj = Mapper.Map<UserViewModel, User>(model); //map between EF Entity and ViewModel
_uow.User.Update(obj);
_uow.Save();
return RedirectToAction("Index");
}
正如您可以看到我的HttpGet
方法检查当前用户是否是数据库中的同一用户。但我的HttpPost
没有做任何检查。这是否足够安全,或者我应该在两种方法中验证?
攻击者可以在不进行GET的情况下进行POST吗?
由于
答案 0 :(得分:8)
攻击者可以在不进行GET的情况下进行POST吗?
是的,当然。 HTTP是无状态的。任何知道该URI的POST的人都可以重新创建并更改它,而无需先执行GET。
当然他们首先要进行GET获取防伪令牌,但之后他们可以随意发帖。
您还可能希望查看绑定特定属性及其授权。例如,如果您的UserViewModel
具有IsAdmin
属性,但您无法检查,则攻击者可以自行管理。
我应该在两种方法中验证吗?
所以,是的。