199

客户端或服务器端验证哪个更好?

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

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

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

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


真棒回答大家。我们拥有的网站是受密码保护的,并且用户群很小(<50)。如果他们没有运行 JavaScript,我们将发送 ninjas。但是,如果我们要为每个人设计一个网站,我会同意双方都进行验证。

4

13 回答 13

375

正如其他人所说,你应该两者都做。原因如下:

客户端

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

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

(这种痛苦可以通过让服务器重新渲染表单并填写用户的原始输入来缓解,但客户端验证仍然更快。)

服务器端

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

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

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

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

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

附录 - 2016 年 12 月

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

于 2008-10-02T14:26:28.333 回答
82

是的,总是可以完全绕过客户端验证。您需要同时做到这一点,客户端以提供更好的用户体验,服务器端以确保您获得的输入实际上是经过验证的,而不仅仅是假设由客户端验证。

于 2008-10-02T13:11:02.867 回答
45

我只是要重复一遍,因为它非常重要:

始终在服务器上验证

并添加 JavaScript 以提高用户响应能力。

于 2008-10-02T13:25:07.640 回答
32

与客户端验证相比,进行服务器端验证的好处是可以绕过/操纵客户端验证:

  • 最终用户可以关闭 javascript
  • 甚至没有使用您的网站的人可以将数据直接发送到您的服务器,并使用专门设计的自定义应用程序
  • 您页面上的 Javascript 错误(由多种原因引起)可能会导致您的部分验证运行,但不是全部

简而言之 - 始终,始终验证服务器端,然后将客户端验证视为增加的“额外”,以增强最终用户体验。

于 2008-10-02T13:12:45.000 回答
18

必须始终在服务器上进行验证。

在客户端进行验证对用户来说也很好,但完全不安全。

于 2008-10-02T13:13:17.683 回答
9

好吧,我仍然找到一些空间来回答。

除了 Rob 和 Nathan 的回答之外,我还要补充一点,客户端验证很重要。当您在 Web 表单上应用验证时,您必须遵循以下准则:

客户端

  1. 必须使用客户端验证来过滤来自您网站上真实用户的真实请求。
  2. 应该使用客户端验证来减少服务器端处理期间可能发生的错误。
  3. 应该使用客户端验证来最小化服务器端的往返行程,以便您节省带宽和每个用户的请求。

服务器端

  1. 您不应该假设在客户端成功完成的验证是 100% 完美的。即使它为少于 50 个用户提供服务。您永远不知道您的哪个用户/员工变成了“邪恶”并在知道您没有适当的验证的情况下进行一些有害的活动。
  2. 即使它在验证电子邮件地址、电话号码或检查某些有效输入方面非常完美,它也可能包含非常有害的数据。无论正确还是错误,都需要在服务器端进行过滤。
  3. 如果绕过客户端验证,您的服务器端验证会帮助您避免对服务器端处理造成任何潜在损害。最近,我们已经听到了很多关于 SQL 注入和其他类型的技术的故事,这些技术可能会被应用以获取一些邪恶的好处。

这两种类型的验证在各自的范围内都扮演着重要的角色,但最强大的是服务器端。如果您在一个时间点收到 10k 个用户,那么您肯定会最终过滤到您的网络服务器的请求数量。如果您发现有一个错误,例如无效的电子邮件地址,那么他们会再次发回表单并要求您的用户更正它,这肯定会占用您的服务器资源和带宽。所以最好你应用javascript验证。如果 javascript 被禁用,那么您的服务器端验证将得到拯救,我敢打赌,只有少数用户可能会意外禁用它,因为 99.99% 的网站使用 javascript,并且它已经在所有现代浏览器中默认启用。

于 2013-02-26T11:54:36.123 回答
9

您可以进行服务器端验证并将每个字段的验证结果发送回 JSON 对象,将客户端 Javascript 保持在最低限度(仅显示结果)并且仍然具有用户友好的体验,而无需在客户端和服务器上重复自己。

于 2013-04-27T20:30:07.123 回答
4

客户端应通过HTML5 输入类型模式属性使用基本验证,因为这些仅用于渐进式增强以获得更好的用户体验(即使 < IE9 和 safari 不支持它们,但我们不依赖它们)。但是主要的验证应该发生在服务器端..

于 2013-08-01T15:13:54.593 回答
4

我建议同时实施客户端和服务器验证,它可以使项目更加安全......如果我必须选择一个,我将使用服务器端验证。

您可以在这里找到一些相关信息 https://web.archive.org/web/20131210085944/http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/

于 2013-11-12T20:04:51.550 回答
3

我遇到了一个有趣的链接,它区分了严重的、系统的、随机的错误。

Client-Side validation非常适合防止严重和随机错误。通常是任何输入的最大长度。不要模仿服务器端的验证规则;提供您自己的总的经验法则验证规则(例如,客户端 200 个字符;n服务器端的特定字符少于 200 个,由强大的业务规则决定)。

Server-side validation非常适合防止系统错误;它将执行业务规则。

在我参与的一个项目中,验证是通过 ajax 请求在服务器上完成的。在客户端上,我相应地显示错误消息。

进一步阅读:严重的、系统的、随机的错误:

https://answers.yahoo.com/question/index?qid=20080918203131AAEt6GO

于 2015-11-20T13:03:19.890 回答
2

JavaScript 可以在运行时修改。

我建议在服务器上创建验证结构并与客户端共享它的模式。

您需要在两端使用单独的验证逻辑,例如:

"required"inputs客户端属性

field.length > 0服务器端。

但是使用相同的验证规范将消除两端镜像验证的一些冗余(和错误)。

于 2013-10-03T21:10:48.427 回答
2

客户端数据验证对于更好的用户体验很有用:例如,我是一个错误地输入了他的电子邮件地址的用户,不应该等到他的请求被远程服务器处理后才知道他所做的错字。

尽管如此,由于攻击者可以绕过客户端验证(甚至可能根本不使用浏览器),因此需要服务器端验证,并且必须是保护后端免受恶意用户攻击的真正大门。

于 2019-04-24T12:44:06.487 回答
-3

如果你在做光照验证,最好在客户端上做。它将节省网络流量,这将有助于您的服务器更好地执行。如果它复杂的验证涉及从数据库或其他东西中提取数据,例如密码,那么最好在可以安全检查数据的服务器上进行。

于 2008-10-02T13:11:45.173 回答