首页 文章

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

提问于
浏览
150

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

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

  • jQuery和MVC .

  • 在我们的View和Controller之间传递的JSON数据 .

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

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


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

12 回答

  • 7

    正如其他人所说,你应该做到这两点 . 原因如下:

    客户端

    您希望首先在客户端验证输入,因为您可以给出 better feedback to the average user . 例如,如果他们输入无效的电子邮件地址并移至下一个字段,则可以立即显示错误消息 . 这样,用户可以更正他们提交表单的每个字段 .

    如果您只在服务器上进行验证,则必须提交表单,收到错误消息,并尝试搜索问题 .

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

    服务器端

    您希望在服务器端进行验证,因为您可以 protect against the malicious user ,谁可以轻松绕过您的JavaScript并向服务器提交危险的输入 .

    信任您的UI非常危险 . Not only can they abuse your UI, but they may not be using your UI at all, or even a browser . 如果用户手动编辑URL,或运行自己的Javascript,或使用其他工具调整HTTP请求,该怎么办?例如,如果他们从 curl 或从脚本发送自定义HTTP请求怎么办?

    (这不是理论上的;例如,我在一个旅行搜索引擎上工作,通过发送 POST 请求重新将用户的搜索提交给许多航空公司, Bus 公司等,好像用户填写了每个公司's search form, then gathered and sorted all the results. Those companies'表格JS从未被执行过,对我们来说,它们在返回的HTML中提供错误消息是至关重要的 . 当然,API会很好,但这是我们必须要做的 . )

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

    服务器端验证对于 compatibility 也很重要 - 并非所有用户(即使他们使用的是浏览器)都会启用JavaScript .

    附录 - 2016年12月

    有一些验证是 can't even be properly done in server-side application code, and are utterly impossible in client-side code ,因为它们取决于数据库的当前状态 . 例如,"nobody else has registered that username",或"the blog post you're commenting on still exists",或"no existing reservation overlaps the dates you requested",或"your account balance still has enough to cover that purchase." Only the database can reliably validate data which depends on related data. Developers regularly screw this up,但PostgreSQL provides some good solutions .

  • 37

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

  • 8

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

    始终在服务器上验证

    并为用户响应添加JavaScript .

  • -2

    通过客户端验证进行服务器端验证的好处是可以绕过/操作客户端验证:

    • 最终用户可以关闭javascript

    • 数据可以由甚至没有使用您网站的人直接发送到您的服务器,并且可以使用自定义应用程序

    • 页面上的Javascript错误(由任意数量的内容引起)可能导致某些(但不是全部)运行验证

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

  • 1

    You must always validate on the server.

    对客户进行验证对用户来说也很好,但是完全没有安全感 .

  • 293

    您可以执行服务器端验证并发回一个JSON对象,其中包含每个字段的验证结果,使客户端Javascript保持最小(仅显示结果),并且仍然具有用户友好的体验,而无需在客户端和服务器上重复自己 .

  • 74

    好吧,我还有一些空间可以回答 .

    除了Rob和Nathan的答案之外,我还要补充说,客户端验证很重要 . 在网络表单上应用验证时,您必须遵循以下准则:

    客户端

    • 必须使用客户端验证才能过滤来自您网站上真实用户的真实请求 .

    • 应使用客户端验证来减少服务器端处理期间可能发生的错误 .

    • 应使用客户端验证来最小化服务器端往返,以便节省带宽和每个用户的请求 .

    服务器端

    • 您不应该假设在客户端成功完成的验证是100%完美的 . 即使它服务的用户少于50个 . 你永远不知道你的哪个用户/员工变成了"evil"并做了一些有害的活动,知道你没有适当的验证 .

    • 即使在验证电子邮件地址,电话号码或检查某些有效输入方面它是完美的,它也可能包含非常有害的数据 . 无论是正确还是错误,都需要在服务器端进行过滤 .

    • 如果绕过客户端验证,您的服务器端验证可以帮助您避免对服务器端处理造成的任何潜在损害 . 最近,我们已经听过很多关于SQL注入的故事和其他可能应用的技术,以获得一些邪恶的好处 .

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

  • 2

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

  • 4

    可以在运行时修改JavaScript .

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

    你需要在两端都有单独的验证逻辑,例如:

    inputs 客户端 "required" 属性

    field.length > 0 服务器端 .

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

  • 2

    我建议实现客户端和服务器验证,它使项目更安全......如果我必须选择一个,我将进行服务器端验证 .

    Update Jul 23 2018: 以下链接不再可访问:

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

  • 30

    我遇到了一个有趣的链接,区分 gross, systematic, random errors.

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

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

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

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

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

  • 17

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

相关问题