正如其他人所说,你应该两者都做。原因如下:
客户端
您希望首先在客户端验证输入,因为您可以向普通用户提供更好的反馈。例如,如果他们输入无效的电子邮件地址并移至下一个字段,您可以立即显示错误消息。这样用户就可以在提交表单之前更正每个字段。
如果您仅在服务器上进行验证,则他们必须提交表单、收到错误消息并尝试查找问题。
(这种痛苦可以通过让服务器在填写用户原始输入的情况下重新呈现表单来缓解,但客户端验证仍然更快。)
服务器端
您希望在服务器端进行验证,因为您可以防范恶意用户,他们可以轻松绕过您的 JavaScript 并向服务器提交危险输入。
信任你的用户界面是非常危险的。他们不仅会滥用您的用户界面,而且他们可能根本不会使用您的用户界面,甚至可能不会使用浏览器。如果用户手动编辑 URL,或者运行他们自己的 Javascript,或者使用其他工具调整他们的 HTTP 请求怎么办?例如,如果他们curl
从脚本或从脚本发送自定义 HTTP 请求会怎样?
(这不是理论上的;例如,我在一个旅行搜索引擎上工作,该引擎通过发送POST
请求将用户的搜索重新提交给许多合作航空公司、巴士公司等,就像用户填写了每个公司的搜索表单一样,然后收集和排序所有的结果。那些公司的表单 JS 从来没有被执行过,他们在返回的 HTML 中提供错误消息对我们来说至关重要。当然,一个 API 会很好,但这是我们必须做的。)
不允许这样做不仅从安全角度来看是幼稚的,而且也是非标准的:应该允许客户端通过他们希望的任何方式发送 HTTP,并且您应该正确响应。这包括验证。
服务器端验证对于兼容性也很重要- 并非所有用户,即使他们使用浏览器,都会启用 JavaScript。
附录 - 2016 年 12 月
有些验证甚至无法在服务器端应用程序代码中正确完成,而在客户端代码中则完全不可能,因为它们取决于数据库的当前状态。例如,“没有其他人注册过那个用户名”,或者“你评论的博客文章仍然存在”,或者“没有现有的预订与你请求的日期重叠”,或者“你的账户余额仍然足以支付这次购买的费用” .” 只有数据库才能可靠地验证依赖于相关数据的数据。开发人员经常搞砸,但PostgreSQL 提供了一些很好的解决方案。