Asp.net core 如果客户端验证已经完成,是否需要服务器端模型验证?

Asp.net core 如果客户端验证已经完成,是否需要服务器端模型验证?,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我正在使用jQuery验证插件在客户端验证输入数据。 是否有必要在服务器端进行验证(如果客户端有效)? 如果我只在客户端进行验证,是否存在安全风险?是的,始终需要服务器端验证,因为禁用javascript可以绕过客户端验证从不信任用户且服务器端始终有效。例如,通过发送无效数据(可能是攻击向量)可以很容易地欺骗请求。对客户端上发生的事情绝对不信任。您收到的所有值都可以直接发送或通过任何支持它的工具(如Postman、Fiddler等)进行扩充,而且它并不需要太深的知识,因此您应该期望任何人都能够做

我正在使用jQuery验证插件在客户端验证输入数据。 是否有必要在服务器端进行验证(如果客户端有效)?
如果我只在客户端进行验证,是否存在安全风险?

是的,始终需要服务器端验证,因为禁用javascript可以绕过客户端验证

从不信任用户且服务器端始终有效。例如,通过发送无效数据(可能是攻击向量)可以很容易地欺骗请求。

对客户端上发生的事情绝对不信任。您收到的所有值都可以直接发送或通过任何支持它的工具(如Postman、Fiddler等)进行扩充,而且它并不需要太深的知识,因此您应该期望任何人都能够做到这一点

这意味着您不仅应该验证您接收的数据,至少与您在客户端上的方式相同,还应该确保执行操作的用户有权这样做。例如,如果您收到更新Id=6的某个对象的请求,则应始终验证用户是否有权执行该操作(例如,某个对象属于该用户等)。如果没有这一点,就很容易“黑客”您的网站(只需使用修改后的Id=7执行相同的请求)

这并不意味着您不应该在客户端上进行验证。但是客户端验证的原因是不同的。它是通过即时反馈(无回发)提供更好的用户体验,而不是信任来自客户端的任何东西

关于你问题的答案:视情况而定。很可能不涉及安全风险。例如,如果您的验证检查电子邮件是否有效,则可以绕过电子邮件,但您面临的唯一风险是您将无法发送邮件,例如,等等。如果您检查手机是否为空,则您将面临手机为空或无法插入数据库的风险

在这种情况下,您可能决定不麻烦,因为您的应用程序的有效使用将不允许这样做,而且用户发布坏数据也不会带来安全风险。所以像往常一样,您应该决定是否值得花时间来实现服务器验证。请记住,这并不意味着您可以跳过上述重要内容,即验证用户是否有访问权限等


在任何情况下,服务器端验证与客户端验证相同都是有益的,但如果值得的话,这是另一个问题。

这并不像您在这里写的那么简单,因为没有服务器端验证(对应于电话、电子邮件等的客户端验证)可能根本没有安全问题。我在下面写了一个更全面的答案。因此,即使客户端验证不能被信任,绕过它也不一定是一个安全问题。我绝对不愿意在两端的代码中进行每一次验证。有些事情你根本不需要它。如果你以声明的方式使用带有数据注释的模型,这两件事都很容易做到,这就是你轻松连接客户端验证的方式,同样的事情也允许你在控制器操作中简单地检查ModelState.IsValid。谢谢你Ilya的全面回答。这很有帮助。从安全角度看,你是对的。Joe Audette提到的案例也是可能出现的另一个问题。比你们好。