JavaScript:客户端与服务器端validation

哪个更好地做客户端或服务器端validation?

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

  • jQuery和MVC。
  • JSON数据在View和Controller之间传递。

我所做的很多validation是在用户input数据时validation数据。 例如,我使用keypress事件来防止文本框中的字母,设置最大数量的字符以及数字在一个范围内。

我想更好的问题是,做客户端的服务器端validation是否有任何好处?


真棒回答大家。 我们拥有的网站是密码保护和小用户群(<50)。 如果他们不运行JavaScript,我们将发送忍者。 但是,如果我们为每个人devise一个网站,我会同意在双方进行validation。

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

客户端

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

如果你只在服务器上validation,他们必须提交表单,得到一个错误信息,并试图找出问题。

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

服务器端

您希望在服务器端进行validation,因为您可以防范恶意用户 ,他们可以轻松绕过您的JavaScript并将危险的input提交给服务器。

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

这不是理论上的;例如,我曾经在一个旅行search引擎上工作,通过发送POST请求,把用户的search重新提交给许多航空公司,公共汽车公司等,就像用户填写了每个公司的search表单一样,然后收集和分类所有的结果,这些公司的JSforms从来没有被执行过,对于我们来说,他们在返回的HTML中提供了错误信息是非常重要的,当然,API本来是不错的,但这是我们必须做的。

不允许这样做,不仅从安全angular度来看是天真的,而且也是非标准的:客户端应该被允许以他们希望的任何方式发送HTTP,并且您应该正确地响应。 这包括validation。

服务器端validation对兼容性也很重要 – 即使使用浏览器,也不是所有用户都启用JavaScript。

附录 – 2016年12月

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

是的,客户端validation可以完全绕过,总是。 为了提供更好的用户体验,您需要同时执行这两个操作,而服务器端则要确保您得到的input实际上已经过validation,而不是被客户端validation。

我只是想重复一遍,因为这很重要:

始终在服务器上进行validation

并为用户响应添加JavaScript。

在服务器端validation客户端validation的好处是客户端validation可以绕过/操纵:

  • 最终用户可以closuresjavascript
  • 这些数据可以通过一个甚至不使用你的网站的人直接发送到你的服务器上,这个应用程序是专门devise的
  • 页面上的Javascript错误(由许多事件引起)可能会导致一些(但不是全部)validation正在运行

简而言之 – 总是validation服务器端,然后考虑客户端validation作为额外的“额外”来增强最终用户体验。

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

在客户端validation对用户来说也是很好的,但是完全不安全。

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

那么,我仍然有一些空间来回答。

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

客户端

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

服务器端

  1. 你不应该假设在客户端成功完成的validation是完美的。 即使服务less于50个用户也是如此。 你永远不知道你的用户/ emplyee哪一个变成一个“邪恶”,做一些有害的活动知道你没有适当的validation到位。
  2. 即使它在validation电子邮件地址,电话号码或检查一些有效的input方面是完美的,它可能包含非常有害的数据。 无论服务器端是正确的还是不正确的,都需要在服务器端进行过滤。
  3. 如果客户端validation被绕过,您的服务器端validation来帮助您解决对服务器端处理的任何潜在损害。 最近,我们已经听到很多关于SQL注入和其他一些可能被用来获得一些恶意的技术的故事。

这两种validation在各自的范围内起着重要的作用,但最强的是服务器端。 如果您在一个时间点上收到10K个用户,那么您肯定会过滤到您网站服务器的请求数量。 如果您发现有一个错误,如无效的电子邮件地址,然后他们再次发回表格,并要求您的用户纠正,这肯定会吃掉您的服务器资源和带宽。 所以你更好地应用JavaScriptvalidation。 如果JavaScript被禁用,那么你的服务器端validation将会救援,我敢打赌,只有less数用户可能会意外地禁用它,因为99.99%的网站使用JavaScript,并且在所有现代浏览器中默认启用。

客户端应该使用基于HTML5inputtypes和模式属性的基本validation,因为这些仅用于渐进式增强,以获得更好的用户体验(即使它们不支持<IE9和Safari浏览器,但我们不依赖它们)。 但主要的validation应该发生在服务器端..

我会build议实施客户端和服务器validation,让项目更安全……如果我不得不select一个我将与服务器端validation。

你可以在这里find一些相关的信息http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/

JavaScript可以在运行时修改。

我build议在服务器上创build一个validation结构的模式,并与客户端共享。

你将需要在两端分别validation逻辑,例如:

inputs客户端的"required"属性

field.length > 0服务器端。

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

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

Client-Side validation非常适合防止严重错误和随机错误。 通常是纹理和input的最大长度。 不要模仿服务器端validation规则; 提供你自己的粗略的经验法则(例如,客户端的200个字符;服务器端由强大的业务规则指定)。

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

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

进一步阅读:粗略的,系统的,随机的错误:

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

如果您正在进行轻量validation,最好在客户端上完成。 这将节省networkingstream量,这将有助于您的服务器更好地执行。 如果复杂的validation涉及从数据库中提取数据或类似密码的数据,那么最好在可以安全检查数据的服务器上执行。