它是安全的,如果我只验证HttpGet

本文关键字:验证 HttpGet 如果 安全 | 更新日期: 2023-09-27 18:16:14

控制器:

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

谢谢

它是安全的,如果我只验证HttpGet

攻击者是否有可能在不做GET的情况下POST ?

当然可以。HTTP没有状态。任何知道POST到那个URI是什么样子的人,都可以在不执行GET的情况下重新创建和修改它。

当然,他们必须首先执行GET操作以获得防伪造令牌,但之后他们可以发布任何他们想要的内容。

您可能还需要查看绑定特定属性及其授权。例如,如果您的UserViewModel具有IsAdmin属性,您不检查,那么攻击者可以使自己成为管理员。

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

所以,是的。