JavaScript:客户端与服务器端验证
进行客户端或者服务器端验证哪个更好?
在我们的情况下,我们正在使用
- jQuery和MVC。
- 在我们的视图和控制器之间传递的JSON数据。
我做的许多验证工作都是在用户输入数据时对数据进行验证。
例如,我使用keypress
事件来阻止文本框中的字母,设置最大字符数,并且该数字在一定范围内。
我想更好的问题是,与客户端相比,进行服务器端验证是否有任何好处?
真棒的答案大家。我们拥有的网站受到密码保护,并且用户群较小(<50)。如果他们没有运行JavaScript,我们将发送忍者。但是,如果我们要为每个人设计一个站点,那么我同意双方都进行验证。
解决方案
是的,始终可以完全绕过客户端验证。我们需要同时做这两个工作,客户端要提供更好的用户体验,而服务器端要确保得到的输入是实际验证的,而不仅仅是客户端验证的验证。
如果我们要进行光验证,则最好在客户端上进行。它将节省网络流量,这服务器更好地运行。如果复杂的验证涉及从数据库或者诸如密码之类的数据中提取数据,那么最好在可以安全检查数据的服务器上进行验证。
与客户端验证相比,执行服务器端验证的好处是可以绕过/操纵客户端验证:
- 最终用户可能已关闭javascript
- 甚至没有使用网站的人也可以使用专门设计的自定义应用程序将数据直接发送到服务器
- 页面上的Javascript错误(由多种原因引起)可能会导致部分(而非全部)验证运行
简而言之,始终要先验证服务器端,然后再将客户端验证视为增加"额外"功能以增强最终用户体验。
我们必须始终在服务器上进行验证。
在客户端上进行验证对用户也很不错,但是完全没有安全感。
我将重复一遍,因为它非常重要:
Always validate on the server
并添加JavaScript以提高用户响应速度。
正如其他人所说,我们应该同时做这两项。原因如下:
客户端
我们希望首先在客户端上验证输入,因为我们可以向普通用户提供更好的反馈。例如,如果他们输入了无效的电子邮件地址并移至下一个字段,则可以立即显示错误消息。这样,用户可以在提交表单之前更正每个字段。
如果仅在服务器上进行验证,则他们必须提交表单,获取错误消息,然后尝试找出问题所在。
(可以通过让服务器重新呈现表单并填充用户的原始输入来减轻这种痛苦,但是客户端验证仍然更快。)
服务器端
我们希望在服务器端进行验证,因为我们可以防御恶意用户,该恶意用户可以轻松绕过JavaScript并将危险的输入提交给服务器。
信任UI是非常危险的。他们不仅会滥用UI,而且可能根本没有使用UI,甚至根本没有使用浏览器。如果用户手动编辑URL或者运行自己的Javascript或者使用其他工具调整HTTP请求该怎么办?例如,如果他们从" curl"或者脚本发送自定义HTTP请求怎么办?
(这不是理论上的;例如,我开发了一个旅行搜索引擎,通过向用户发送" POST"请求,就像用户已经填写了各公司的搜索表格一样,然后将用户的搜索重新提交给许多航空公司,公交公司等。这些公司的表格JS从未执行过,对我们来说至关重要的是,它们在返回的HTML中提供错误消息。 )
从安全的角度来看,不允许这样做不仅是幼稚的,而且是非标准的:应允许客户端以他们希望的任何方式发送HTTP,并且我们应该正确响应。这包括验证。
服务器端验证对于兼容性也很重要,即使不是所有用户,即使他们使用的是浏览器,也都将启用JavaScript。
附录-2016年12月
有些验证甚至无法在服务器端应用程序代码中正确完成,而在客户端代码中则完全不可能,因为它们取决于数据库的当前状态。例如,"其他人都没有注册该用户名","我们正在评论的博客文章仍然存在","现有的预订不与我们请求的日期重叠"或者"帐户余额仍然足以支付该笔购买费用" "。只有数据库才能可靠地验证依赖于相关数据的数据。开发人员经常将其弄糟,但是PostgreSQL提供了一些很好的解决方案。