我最近的一个MVC3项目遭到了我的讲师的攻击,他不会告诉我他是怎么做到的,直到他在几周内向全班演讲。然而,我不能等待这么久。
我的问题是,有没有办法拦截从View发送到Controllers POST方法的数据?如果是这样,这种方法的含义是什么?如何阻止它?
例如:
将User对象发布到数据库的注册页面。 用户对象有一个布尔管理员,自动设置为false。 黑客拦截Post并将Users Admin属性的值更改为true。
任何帮助都会很棒。
答案 0 :(得分:4)
对控制器(或任何HTTP处理程序)的请求没有任何特殊或受保护。它只是一串名称/值对,可以随意更改。查看Visual Studio调试器的即时窗口中的Request.Form
。
您可以使用Firefox Tamper Data插件等工具篡改表单数据。即使没有使用几行代码的工具,修改也是微不足道的。您甚至不需要Web浏览器就可以这样做。
我的猜测是你的讲师只是将POST从IsAdmin=false
更改为IsAdmin=true
那么我们如何防止这种情况呢?
验证所有输入。 POST / view模型说IsAdmin = true?好的,来电者是否有权进行这项任务?
创建不显示您不想更改的属性的视图模型。 即使某个页面上没有显示某个属性,如果它在请求中,ModelBinder也会将其绑定。这意味着即使您没有在该页面上放置IsAdmin
复选框也是如此。如果视图模型包含IsAdmin属性,则可以设置页面。
您可以选择性地将模型的属性标记为不可绑定,但我通常不建议这样做;它太容易忘记了。
答案 1 :(得分:0)
亚伦说。什么都不可信任。一切都必须检查。如果“admin”的唯一决定因素是传入的布尔值,则需要更多安全性,例如令牌或在更新/检查数据时可以在数据库中进行双重检查的内容。