首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >开发人员应该如何处理与路由变量冲突的表单POST变量?

开发人员应该如何处理与路由变量冲突的表单POST变量?
EN

Security用户
提问于 2013-11-25 16:26:03
回答 2查看 2K关注 0票数 1

在ASP.NET MVC中,当我向/controller/action/UserID执行HTTP时.

并有一个相应的路线/controller/action/{UserID} ..。

如果我做了表单发布,POSTed data UserID会覆盖路由最初说的任何内容。(至少在ASP.NET MVC4中是这样的)

对我来说,这说明了几点:

  • 别相信网址..。因为POSTed数据可能隐藏真实发生的事情。
  • 任何能够猜出ASP.NET MVC中路由变量名的人都可以将意外的数据放入控制器中。
  • .?

问题

  • 这种行为在其他MVC框架(Rails等)之间是否一致?
  • 有什么方法可以防止这种意想不到的结果呢?每个帖子应该与URL参数交叉检查吗?
EN

回答 2

Security用户

发布于 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,只要您是一致的),然后根据它做出所有逻辑决策。这包括最初的授权,以及处理和业务逻辑--它们都应该使用价值的相同来源,以确保只有在授权时才能执行操作。

票数 2
EN

Security用户

发布于 2015-03-16 22:53:16

如果要分离或区分GET/POST操作,则应使用AcceptVerbs属性。例如,若要强制某个操作仅响应POST请求,请向其添加以下属性:

代码语言:javascript
运行
AI代码解释
复制
[AcceptVerbs(HttpVerbs.Post)]

并将以下内容添加到GET 1中

代码语言:javascript
运行
AI代码解释
复制
[AcceptVerbs(HttpVerbs.Get)]

通过这样做,可以确保只有理想的请求类型(GET、POST、.)可以触摸动作的方法。

关于您问题的另一面,有一个与所有MVC框架相关的web攻击称为Over Posting,如果您完全依赖于模型绑定器,就会发生这种攻击。为了防止这种攻击,你有两种方法:

  • 使用视图模型
  • 使用Bind属性

我想第一个问题很清楚。大约第二步,您可以强化一个POST操作方法,如下所示:

代码语言:javascript
运行
AI代码解释
复制
[AcceptVerbs(HttpVerbs.Get)]     
public ActionResult AddComment([Bind(Include = "Name, Email, CommentText")] Comment model)

此外,还可以将Bind属性添加到模型定义本身。

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/46048

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文