哪个更好做客户端或服务器端验证?
在我们的情况下,我们正在使用
jQuery和MVC.
要在View和Controller之间传递的JSON数据.
我做的很多验证都是在用户输入数据时验证数据.例如,我使用该keypress
事件来防止文本框中的字母,设置最大字符数以及数字在一个范围内.
我想更好的问题是,在客户端进行服务器端验证有什么好处吗?
很棒的回答每个人.我们拥有的网站受密码保护,用户群较小(<50).如果他们没有运行JavaScript,我们将发送忍者.但如果我们为每个人设计一个网站,我同意在双方进行验证.
正如其他人所说,你应该做到这两点.原因如下:
您希望首先在客户端验证输入,因为您可以向普通用户提供更好的反馈.例如,如果他们输入无效的电子邮件地址并移至下一个字段,则可以立即显示错误消息.这样,用户可以在提交表单之前更正每个字段.
如果您只在服务器上进行验证,则必须提交表单,收到错误消息,并尝试搜索问题.
(通过让服务器在填写用户原始输入的情况下重新呈现表单,可以缓解这种痛苦,但客户端验证仍然更快.)
您希望在服务器端进行验证,因为您可以防止恶意用户,他们可以轻松绕过您的JavaScript并向服务器提交危险的输入.
信任您的UI非常危险.他们不仅可以滥用您的用户界面,而且可能根本不使用您的用户界面,甚至浏览器.如果用户手动编辑URL,或运行自己的Javascript,或使用其他工具调整HTTP请求,该怎么办?例如,如果他们curl
从脚本发送自定义HTTP请求怎么办?
(这不是理论上的;例如,我在旅行搜索引擎上工作,通过发送POST
请求,如同用户填写了每个公司的搜索表单,然后收集并整理所有搜索引擎,将用户的搜索重新提交给许多航空公司,公交公司等结果.那些公司的表格JS从未被执行过,而且我们在返回的HTML中提供错误消息对我们至关重要.当然,API本来不错,但这是我们必须做的.)
不允许这样做不仅从安全角度来说是天真的,而且也是非标准的:应允许客户端以他们希望的任何方式发送HTTP,并且您应该正确响应.这包括验证.
服务器端验证对于兼容性也很重要- 并非所有用户(即使他们使用浏览器)都会启用JavaScript.
有些验证甚至无法在服务器端应用程序代码中正确完成,并且在客户端代码中完全不可能,因为它们依赖于数据库的当前状态.例如,"其他人没有注册该用户名",或"您评论的博客文章仍然存在",或"没有现有预订与您请求的日期重叠",或者"您的帐户余额仍然足以涵盖该购买".只有数据库才能可靠地验证依赖于相关数据的数据.开发人员经常搞砸了,但PostgreSQL提供了一些很好的解决方案.
是的,始终可以完全绕过客户端验证.您需要同时执行这两个操作,客户端提供更好的用户体验,并且服务器端确保您获得的输入实际上已经过验证,而不仅仅是客户端验证的.
我只想重复一遍,因为它非常重要:
始终在服务器上验证
并为用户响应添加JavaScript.
通过客户端验证进行服务器端验证的好处是可以绕过/操作客户端验证:
最终用户可以关闭javascript
数据可以由甚至不使用您的网站的人直接发送到您的服务器,并使用专门设计的自定义应用程序
您网页上的Javascript错误(由任意数量的内容引起)可能会导致部分(但不是全部)运行验证
简而言之 - 始终始终验证服务器端,然后将客户端验证视为增加的"额外"以增强最终用户体验.
您必须始终在服务器上进行验证.
在客户端进行验证对用户来说也很好,但是完全没有安全感.
好吧,我还有一些空间可以回答.
除了Rob和Nathan的答案之外,我还要补充说,客户端验证很重要.在网络表单上应用验证时,您必须遵循以下准则:
必须使用客户端验证才能过滤来自您网站上真正用户的真实请求.
应使用客户端验证来减少服务器端处理期间可能发生的错误.
应使用客户端验证来最小化服务器端往返,以便节省带宽和每个用户的请求.
您不应该假设在客户端成功完成的验证是100%完美的.即使它服务的用户少于50个.你永远不知道你的哪个用户/员工变成了"邪恶"并做了一些有害的活动,知道你没有适当的验证.
即使它在验证电子邮件地址,电话号码或检查一些有效输入方面是完美的,它也可能包含非常有害的数据.无论是正确还是错误,都需要在服务器端进行过滤.
如果绕过客户端验证,则服务器端验证可以帮助您避免对服务器端处理造成任何潜在损害.最近,我们已经听过很多关于SQL注入的故事和其他可能应用的技术,以获得一些邪恶的好处.
两种类型的验证在各自的范围内都起着重要作用,但最强大的是服务器端.如果您在一个时间点收到10k用户,那么您肯定会最终过滤到您的网络服务器的请求数量.如果您发现有一个错误,例如无效的电子邮件地址,那么他们会再次回复该表单并要求您的用户更正它,这肯定会占用您的服务器资源和带宽.所以你应用javascript验证更好.如果javascript被禁用,那么你的服务器端验证将会解决,我打赌只有少数用户可能会意外地禁用它,因为99.99%的网站使用javascript,并且在所有现代浏览器中默认已经启用.
您可以执行服务器端验证并发回一个JSON对象,其中包含每个字段的验证结果,使客户端Javascript保持最小(仅显示结果),并且仍然具有用户友好的体验,而无需在客户端和服务器上重复自己.