如果我只在HttpGet上验证它是否安全?

时间:2015-10-05 10:20:58

标签: c# asp.net-mvc security asp.net-mvc-5

控制器:

[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吗?

由于

1 个答案:

答案 0 :(得分:8)

  

攻击者可以在不进行GET的情况下进行POST吗?

是的,当然。 HTTP是无状态的。任何知道该URI的POST的人都可以重新创建并更改它,而无需先执行GET。

当然他们首先要进行GET获取防伪令牌,但之后他们可以随意发帖。

您还可能希望查看绑定特定属性及其授权。例如,如果您的UserViewModel具有IsAdmin属性,但您无法检查,则攻击者可以自行管理。

  

我应该在两种方法中验证吗?

所以,是的。