在ASP.NET MVC中,当我向/controller/action/UserID
执行HTTP时.
并有一个相应的路线/controller/action/{UserID}
..。
如果我做了表单发布,POSTed data UserID
会覆盖路由最初说的任何内容。(至少在ASP.NET MVC4中是这样的)
对我来说,这说明了几点:
发布于 2013-11-27 02:41:18
别相信网址..。因为POSTed数据可能隐藏真实发生的事情。
URL应该被视为客户端的值,而且无论如何都不应该被信任。任何人都可以轻松地更改URL,并且可以轻松地为任何UserID
创建一个帖子。
任何能够猜出ASP.NET MVC中路由变量名的人都可以将意外的数据放入控制器中。
无论如何,这都可以通过参数篡改来实现。在本指南中有一些有用的提示:http://msdn.microsoft.com/en-us/magazine/hh580736.aspx
具体来说
那是什么?参数篡改是一种攻击,其中参数被修改,以改变应用程序的预期功能。参数可能位于表单、查询字符串、cookie、数据库等上。我将讨论涉及基于Web的参数的攻击。它是如何被利用的?攻击者更改参数以欺骗应用程序执行它不打算执行的操作。假设您通过从查询字符串读取用户ID来保存用户的记录。这安全吗?不是的。攻击者可以篡改应用程序中的URL
在MVC中,这可以通过模型绑定实现:
模型绑定是(MVC)的一个重要特性,它有助于参数检查,因为Order对象上的属性将根据表单信息自动填充并转换为其定义的类型。..。只是要小心限制允许填充哪些属性,同样,对于重要项,不要信任页面数据。..。请注意,我在这里使用约束(排除) attrib来限制MVC绑定到我的模型中的内容,以便控制我所做或不信任的事情。这确保了UserId不会来自表单数据,因此不会被篡改。
因此,您还应该注意,您的视图中不存在的表单参数不能被恶意用户篡改和添加。您可以通过添加Exclude
属性来做到这一点:
public ActionResult Edit([Bind(Exclude="UserId")] Order order)
这种行为在其他MVC框架(Rails等)之间是否一致?
不确定,但我不认为这是一个缺陷,因为权限检查应该进行的帖子和你的得到。您的应用程序不应该仅仅因为一个错误的断言,即必须首先加载了带有POSTed窗体的URL,就假定一个被称为的URL具有这样做的权限。
有什么方法可以防止这种意想不到的结果呢?每个帖子应该与URL参数交叉检查吗?
您的代码应该决定使用路由变量或POST变量(如果它是从MVC提供给您的,作为一个名为UserID
的方法变量,那么为什么不使用它,如果它来自POST数据或URL,只要您是一致的),然后根据它做出所有逻辑决策。这包括最初的授权,以及处理和业务逻辑--它们都应该使用价值的相同来源,以确保只有在授权时才能执行操作。
发布于 2015-03-16 22:53:16
如果要分离或区分GET/POST操作,则应使用AcceptVerbs
属性。例如,若要强制某个操作仅响应POST请求,请向其添加以下属性:
[AcceptVerbs(HttpVerbs.Post)]
并将以下内容添加到GET 1中
[AcceptVerbs(HttpVerbs.Get)]
通过这样做,可以确保只有理想的请求类型(GET、POST、.)可以触摸动作的方法。
关于您问题的另一面,有一个与所有MVC框架相关的web攻击称为Over Posting
,如果您完全依赖于模型绑定器,就会发生这种攻击。为了防止这种攻击,你有两种方法:
Bind
属性我想第一个问题很清楚。大约第二步,您可以强化一个POST操作方法,如下所示:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult AddComment([Bind(Include = "Name, Email, CommentText")] Comment model)
此外,还可以将Bind
属性添加到模型定义本身。
https://security.stackexchange.com/questions/46048
复制