2

ASP.NET MVC 提供数据注释功能。因此,如果我们在 mdoels 中指定所需的装饰器,则会处理验证。

如果是这样,那我们为什么还要ModelState.IsValid()在控制器中进行检查。显然,只有当视图中的所有数据都有效时,才会在控制器中调用该操作。

这样做是为了仔细检查用户输入吗?

它是如何工作的?

4

3 回答 3

4

Web 安全的第一条规则是“永远不要信任客户端”。仅仅因为你有客户端验证(MVC 默认提供)并不意味着它不可能通过它。

例如,用户可以禁用 JavaScript,或者您可能有一个鬼鬼祟祟的用户试图拉一个快速的,并自己发送数据,绕过您的表单。

[Required] 属性做了两件事。首先,如果启用,它会设置客户端验证。在这种情况下,如果表单无效,则不会提交表单。它还提供服务器端验证(这是在 ModelState 上设置 IsValid 标志的原因。

如果 JavaScript 被禁用,或者有人试图手动提交数据,那么您需要服务器端检查作为最后一道防线。

于 2013-06-09T06:21:00.040 回答
2

即使输入无效,仍会调用控制器。也许您有阻止请求触发的 Java 脚本验证。您仍然应该检查服务器,因为用户可以禁用 Java Script

于 2013-06-09T05:14:24.153 回答
2

当您在模型中使用装饰器时,您可以使用两种类型的验证。第一个是客户端验证 - 这是当您的模型有一个名为“名称”的属性,并且您在 .cshtml 文件中使用类似 @Html.TextBoxFor(m => m.name) 的内容时,这会在您的带有客户端 javascript 的页面。您不是自己编写此 javascript,它是由 asp.net mvc 添加到您的页面的。如果您查看页面的源代码,您可以看到它。

这样做的好处是客户端检查发生在表单发布之前,因此用户不会等待它发布并返回验证错误。坏事是可以绕过客户端验证。如果用户禁用了 JavaScript,那么它就不会发生。或者,恶意用户可以自己发出帖子请求,而不是填写您的表单并按下提交,因此帖子在没有客户端验证的情况下通过。

因此,您需要使用第二种可用的验证方式——服务器端验证。当您执行 ModelState.IsValid() 时,即执行服务器端验证时,它使用您的装饰器作为此验证的基础。如果您在此处没有此声明,那么您没有执行任何服务器端验证,并且仅依赖客户端验证(正如我刚刚提到的那样,这是一个坏主意,因为它可以被规避)。我的经验法则是始终将其用于任何发布请求。

于 2013-06-09T06:18:54.903 回答