ASP.NET MVC提供了数据注释功能。因此,如果我们在mdoel中指定了所需的装饰器,验证就会得到处理。
如果是这样,那么为什么我们还要在控制器中检查ModelState.IsValid()。显然,只有当视图中的所有数据都有效时,才会在控制器中调用操作。
这样做是为了仔细检查用户输入吗?
它怎麽工作?
发布于 2013-06-09 14:21:00
网络安全的第一条规则是“永远不要信任客户端”。仅仅因为您有客户端验证( MVC默认提供了客户端验证),并不意味着有些东西不可能通过它。
例如,用户可以禁用JavaScript,或者您可能有一个偷偷摸摸的用户,他试图拉一个快速的,并自己发送数据,绕过您的表单。
Required属性做两件事。首先,如果启用了客户端验证,它会设置客户端验证。在这种情况下,如果表单无效,则不会提交表单。它还提供服务器端验证(这是在ModelState上设置IsValid标志的内容。
如果JavaScript被禁用,或者有人试图手动提交数据,那么您需要服务器端检查作为最后一道防线。
发布于 2013-06-09 13:14:24
即使输入无效,控制器仍然会被调用。也许您可以使用Java Script验证来阻止请求触发。您仍然应该检查服务器,因为用户可以禁用Java Script
发布于 2013-06-09 14:18:55
当您在模型中使用装饰器时,您可以使用两种类型的验证。第一个是客户端验证--当你的模型有一个名为'name‘的属性时,你在你的.cshtml文件中使用了类似@Html.TextBoxFor(m => m.name)的东西,这会在你的页面上放置一个带有客户端javascript的文本框。这段javascript不是你自己写的,它是由asp.net mvc添加到你的页面上的。如果您查看页面的源代码,就可以看到它。
这样做的好处是,客户端检查是在表单发布之前进行的,所以用户不会等待表单发布并返回验证错误。不好的是客户端验证可以绕过。如果用户禁用了JavaScript,则不会发生这种情况。或者,恶意用户可以自己发出post请求,而不是填写表单并按submit,因此post无需客户端验证即可通过。
因此,您需要使用可用的第二种类型的验证-服务器端验证。当您执行ModelState.IsValid()时,即执行服务器端验证时,它使用您的装饰器作为此验证的基础。如果您在这里没有这个语句,那么您将不会执行任何服务器端验证,而是完全依赖于客户端验证(正如我刚才提到的,这是一个坏主意,因为它可以被规避)。我的经验法则是总是在任何post请求中使用它。
https://stackoverflow.com/questions/17006658
复制相似问题