JavaScript:客户端与服务器端验证

2022-08-30 01:21:45

哪个更适合进行客户端或服务器端验证?

在我们的情况下,我们正在使用

  • jQuery 和 MVC.
  • 要在我们的视图和控制器之间传递的 JSON 数据。

我所做的很多验证都是在用户输入数据时验证数据。例如,我使用事件来防止文本框中的字母,设置最大字符数,并且数字在一个范围内。keypress

我想更好的问题是,在客户端进行服务器端验证有什么好处吗?


真棒回答每个人。我们拥有的网站受密码保护,用户群较小(<50)。如果他们没有运行JavaScript,我们将派遣忍者。但是,如果我们为每个人设计一个网站,我会同意在双方进行验证。


答案 1

正如其他人所说,你应该同时做这两件事。原因如下:

客户端

您希望首先在客户端验证输入,因为您可以向普通用户提供更好的反馈。例如,如果他们输入了无效的电子邮件地址并移动到下一个字段,您可以立即显示错误消息。这样,用户可以在提交表单之前更正每个字段。

如果您只在服务器上进行验证,他们必须提交表单,获取错误消息,并尝试查找问题。

(通过让服务器在填写用户的原始输入的情况下重新呈现表单,可以缓解这种痛苦,但客户端验证仍然更快。

服务器端

您希望在服务器端进行验证,因为您可以防范恶意用户,他们可以轻松地绕过您的JavaScript并向服务器提交危险输入。

信任你的 UI 是非常危险的。他们不仅可以滥用您的UI,而且可能根本不使用您的UI,甚至不使用浏览器。如果用户手动编辑URL,或者运行自己的Javascript,或者使用其他工具调整他们的HTTP请求,该怎么办?例如,如果他们从脚本发送自定义 HTTP 请求,或者从脚本发送自定义 HTTP 请求,该怎么办?curl

(这不是理论上的;这是理论上的。例如,我在一个旅游搜索引擎上工作,该搜索引擎通过发送POST请求将用户的搜索重新提交给许多合作伙伴航空公司,巴士公司等,就好像用户填写了每家公司的搜索表单一样,然后收集并排序了所有结果。这些公司的表单JS从未被执行过,对我们来说,他们在返回的HTML中提供错误消息至关重要。当然,API会很好,但这是我们必须做的。)

从安全的角度来看,不允许这样做不仅是幼稚的,而且也是非标准的:应该允许客户端以他们想要的任何方式发送HTTP,并且你应该正确响应。这包括验证。

服务器端验证对于兼容性也很重要 - 并非所有用户,即使他们使用的是浏览器,也会启用JavaScript。

附录 - 2016年12月

有些验证甚至无法在服务器端应用程序代码中正确完成,并且在客户端代码中完全不可能,因为它们依赖于数据库的当前状态。例如,“没有其他人注册该用户名”,或者“您正在评论的博客文章仍然存在”,或者“没有现有预订与您请求的日期重叠”,或者“您的帐户余额仍足以支付该购买费用”。只有数据库才能可靠地验证依赖于相关数据的数据。开发人员经常搞砸这个,但PostgreSQL提供了一些很好的解决方案


答案 2

是的,客户端验证可以始终完全绕过。您需要同时执行这两项操作,客户端以提供更好的用户体验,服务器端以确保您获得的输入实际上已经过验证,而不仅仅是由客户端验证。