拦截ASP NET MVC POST值

时间:2013-02-05 15:32:29

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

我最近的一个MVC3项目遭到了我的讲师的攻击,他不会告诉我他是怎么做到的,直到他在几周内向全班演讲。然而,我不能等待这么久。

我的问题是,有没有办法拦截从View发送到Controllers POST方法的数据?如果是这样,这种方法的含义是什么?如何阻止它?

例如:

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

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:4)

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

您可以使用Firefox Tamper Data插件等工具篡改表单数据。即使没有使用几行代码的工具,修改也是微不足道的。您甚至不需要Web浏览器就可以这样做。

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

那么我们如何防止这种情况呢?

  • 验证所有输入。 POST / view模型说IsAdmin = true?好的,来电者是否有权进行这项任务?

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

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

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

答案 1 :(得分:0)

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