我的讲师入侵了我的一个最近的MVC3项目,直到他在几周内向全班作介绍之前,他不会告诉我他是如何做到的。但是,我等不了那么久了。
我的问题是,有没有办法拦截从View发送到Controllers POST方法的数据?如果是这样,此方法称为什么,如何停止?
例如:
将用户对象发布到数据库的注册页面。
用户对象的布尔值Admin会自动设置为false。
黑客拦截Post,并将Users Admin属性的值更改为true。
任何帮助都会很棒。
最佳答案
对控制器(或任何HTTP处理程序)的请求没有任何特殊或受保护的地方。它只是一串名称/值对,可以随意更改。在Visual Studio调试器的立即窗口中查看Request.Form
。
您可以使用Firefox Tamper Data插件之类的工具篡改表单数据。即使没有使用几行代码的工具进行修改,也很容易。您甚至不需要网络浏览器即可。
我的猜测是您的讲师只是将POST从IsAdmin=false
更改为IsAdmin=true
那么如何防止这种情况呢?
验证所有输入。 POST /视图模型显示IsAdmin = true?好的,呼叫者有权进行分配吗?
创建不公开您不想更改的属性的视图模型。即使属性未显示在页面上,如果该属性在请求中,ModelBinder也会绑定该属性。这意味着即使您未在页面上放置IsAdmin
复选框,也可以在视图模型包含IsAdmin属性的情况下进行设置。
您可以有选择地将模型的属性标记为不可绑定,但是我通常不建议这样做。太容易忘记了。
另请参阅:ASP.NET MVC - Alternative for [Bind(Exclude = "Id")]