【问题标题】:Intercepting ASP NET MVC POST Values拦截 ASP NET MVC POST 值
【发布时间】:2013-02-05 15:32:29
【问题描述】:

我最近的一个 MVC3 项目被我的讲师破解了,他不会告诉我他是如何做到的,直到他在几周内向全班同学做演示。但是我不能等这么久。

我的问题是,有没有办法拦截从视图发送到控制器 POST 方法的数据?如果是这样,这种方法是什么,我该如何阻止它?

例如:

将用户对象发布到数据库的注册页面。 用户对象有一个布尔 Admin,它自动设置为 false。 黑客拦截 Post 并将 Users Admin 属性的值更改为 true。

任何帮助都会很棒。

【问题讨论】:

  • 你能发布你的控制器动作和用户模型吗?
  • 您说他“入侵”了您的网站。你能更具体地说明实际做了什么吗?我猜他要么使用暴力破解,要么使用跨站点脚本。
  • post 方法可以接受的任何内容都可以发送给它。因此,任何人都可以在管理员设置为 true 的情况下发布新用户。您需要在您的 post 方法中手动将 admin 设置为 false,除非您希望允许它为 true。

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


【解决方案1】:

向控制器(或任何 HTTP 处理程序)发出的请求没有什么特别或受保护的。它只是一串可以随意更改的名称/值对。在 Visual Studio 调试器的即时窗口中查看 Request.Form

您可以使用Firefox Tamper Data 插件之类的工具篡改表单数据。即使没有工具使用几行代码进行修改也是微不足道的。您甚至不需要网络浏览器即可。

我猜你的讲师只是将 POST 从 IsAdmin=false 更改为 IsAdmin=true

那么我们该如何预防呢?

  • 验证所有输入。 POST/view 模型说 IsAdmin=true?好的,调用者是否有权进行该分配?

  • 创建不公开您不想更改的属性的视图模型。 即使页面上没有显示属性,如果它在请求中,ModelBinder 也会绑定它。 这意味着即使您没有在页面上放置IsAdmin 复选框如果视图模型包含 IsAdmin 属性,则可以设置。

  • 您可以选择性地将模型的属性标记为不可绑定,但我通常不建议这样做;太容易忘记了。

另见:ASP.NET MVC - Alternative for [Bind(Exclude = "Id")]

【讨论】:

    【解决方案2】:

    亚伦所说的。没有什么是可以信任的。一切都必须检查。如果“admin”的唯一决定因素是传入的布尔值,则您将需要更高的安全性,例如令牌或可以在更新/检查数据时在数据库中双重检查的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2011-11-22
      相关资源
      最近更新 更多