11

如果我有 2 个控制器操作:

    [HttpGet]
    public ActionResult Login()
    {
        //...

        return View();
    }

    [HttpPost]
    public ActionResult Login(FormCollection values)
    {
        //...

        return RedirectToAction("Index","Home");
    }

似乎需要 Post 装饰才能使其工作(这是有道理的),但 HttpGet 装饰完全是可选的。无论有没有,它都可以正常工作。除非另有说明,否则 MVC 似乎将控制器操作默认为 HttpGet。

我必须决定我是否希望我的代码的未来读者必须自己解决这个问题,或者我是否要记住在任何地方添加 HttpGet 以保持一致性。但我的问题不在于包含显式装饰是否是一种好习惯,即使它已经默认采用这种方式。

我的问题是:总是不需要用 HttpGet 装饰控制器方法吗?如果我明确指定或不明确指定,有什么方法可以咬我吗?我已经对此进行了搜索,但是我能找到的只是一些帖子,这些帖子描述了您可能想要同时使用这两个注释的原因,而不是专门针对/反对包括 HttpGet 的原因。

4

2 回答 2

12

您不必明确指定这一点,不。但是,请注意:

  • 不指定动作上的动词将意味着该方法同时接受 GET 和 POST。但是,如果有两个操作,则标记为 POST 的一个将用于 POST,而另一个将默认用于 GET。
  • 应用 HttpGet 意味着一个动作只接受 GET 请求。
  • 将操作标记为 GET 可以让其他开发人员更清楚您的意图是什么。

如果我明确指定或不明确指定,有什么方法可以咬我吗?

不太可能。我可以想象这样一种情况,其中某些东西可能会表现出一些奇怪的行为或因此而无法按预期工作,但这种情况很少见。

于 2014-03-16T21:54:39.537 回答
3

如果我明确指定或不明确指定,有什么方法可以咬我吗?

在这里,我想开发一个 Rowan Freeman 的答案,关于不[HttpGet]明确使用每个 GET 方法的后果。

正如已经提到的,没有[HttpGet]注释的方法将同时接受 GET 和 POST 请求(除非有另一个同名的方法用 注释[HttpPost])。如果一个方法被显式注解[HttpGet],将返回405 Method Not Allowed 。

我可以想象的一个后果是,如果攻击者想通过 GET 请求发送大量数据,它会有一个限制。没有[HttpGet]注释,这个限制不是问题,因为攻击者可以切换到 POST 并且没有任何限制地做同样的事情。

另一个类似的情况是:

HTTPGet 只能携带字符串数据,而 HTTPPost 可以携带字符串和二进制数据。

另一件事是 POST 请求可能不会完全记录在服务器上,因此攻击者可以以某种方式向管理员隐藏它的活动,因为攻击者的有效负载将不可见(主体不会出现在日志中)。

可以在此处找到 POST 和 GET 之间的比较(我引用过): ASP.NET MVC 5 – HTTPGET 和 HTTPPOST 方法示例

当然,所有这些情况都非常罕见,但这就是漏洞利用的意义所在——寻找可能成为漏洞的罕见事物。

总而言之,总是在控制器方法中编写注释是一个好习惯[HttpGet]。它只是可以提高 Web 应用程序安全性的一条线。

于 2020-06-24T09:54:53.837 回答