3

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

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

例如:

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

任何帮助都会很棒。

4

2 回答 2

5

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

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

我的猜测是您的讲师只是将 POST 从更改IsAdmin=falseIsAdmin=true

那么我们该如何预防呢?

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

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

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

另请参阅:ASP.NET MVC - [Bind(Exclude = "Id")] 的替代方案

于 2013-02-05T16:52:17.217 回答
0

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

于 2013-02-05T16:39:27.237 回答