【问题标题】:Remove server side validation and make a full blown client side validation?删除服务器端验证并进行全面的客户端验证?
【发布时间】:2013-10-03 03:11:16
【问题描述】:

是否建议在客户端进行所有必要的输入验证?我想优化服务器的处理(意味着更少的双重验证,以便程序员可能只关注业务逻辑)。

例子:

  • 在客户端,有一个“年龄”输入 textfieldJavaScript 不允许提交表单,除非它在范围内)

  • 在服务器端,不再验证“年龄”

    // 而不是再次验证年龄

    int age = Integer.parseInt(request.getParameter("age")); // 检查年龄是否有效

    if(age >= 0 ) { /* 代码 * / }

我们只能继续

int age = Integer.parseInt(request.getParameter("age"));

因为我们非常确定它是有效的。

为了适应 Web 浏览器中禁用的JavaScripts,我们需要先进行检查。如果启用了JavaScript,则继续应用程序,否则阻止应用程序。 (就像脸书一样)

我的理论/概念可以接受吗?

【问题讨论】:

  • “因为我们非常确定它是有效的。” -- 你永远无法确定,你总是必须在服务器上验证。
  • “我想优化服务器的处理”——你真正的意思是“我不想做同样的工作两次”。我知道那种感觉,我去过那里。然而,对于重要和安全敏感的数据,仍然没有办法绕过服务器端验证。客户端的任何数据都可以伪造。
  • 使用客户端验证的主要优势之一是它“避免了页面回发”。这在 AJAX 不太流行的旧时代非常重要。即使使用 AJAX,客户端验证也能提供更快的响应和更好的用户体验。

标签: javascript validation optimization client-side server-side


【解决方案1】:

如果您需要强制执行某些输入模式,则不能依赖来自客户端的数据。人们可以禁用 JavaScript,或者完全绕过您的验证并发送他们想要的任何数据。不过大部分普通用户不会有这个问题,反正数据都是从客户端来的。

简而言之,视情况而定

对于我的大多数应用程序,我都有客户端验证,只担心服务器端的某些事情会引发错误情况。例如,如果我有一个向某人发送电子邮件的表单,我将使用 JavaScript 来检查有效的to: 电子邮件地址,并提醒用户。在服务器端,如果该电子邮件地址无效或不存在,我将简单地抛出一个编写代码的错误,让用户清楚地知道出了什么问题。对于消息体,我将验证客户端是否有消息体,但服务器端我并不关心。同样,您做什么取决于您的需求。

【讨论】:

    【解决方案2】:

    我相信无处不在的验证

    我喜欢客户端验证:

    • 已填充必填字段
    • 最小大小字段(如 zip)
    • 正则表达式,用于在适当的位置(例如社会保险号、新密码等)提供适当的字符类型
    • 特权实施(用户只能查看和执行应允许其角色执行的操作)

    服务器端验证:

    • 所有客户端要求
    • 实体关联(父子关系是合法的)
    • 更改或请求是角色授权的

    用户入口是敌人!用户会找到一种方法来随意或不情愿地破坏您的网站。事情会从裂缝中消失。 所以我强烈支持双重和三重检查。

    我相信客户端验证可以节省服务器处理,如果不是因为我担心这种想法会使我的异常更加突出。

    总的来说,我重视富客户端验证的原因是:

    • 多一层检查数据完整性(以及服务器端)
    • 引导用户;智能客户端验证可帮助用户更快地做出更有效的答案
    • 更好的体验;如果用户不必等待循环返回服务器并返回客户端来查看错误,那么他们的用户体验应该会更好。

    【讨论】:

      【解决方案3】:

      如果安全/数据完整性是一个问题,我建议不要这样做。虽然这足以阻止 Joe Smith 输入不需要的数据,但您会让系统对了解 Web 工作原理的人进行严重的数据操作开放。

      假设您有一个像 StackOverflow 这样的投票系统,只要用户投票,就会进行 AJAX 调用。虽然 JS 验证可能会阻止一个人使用显示的 HTML 对同一个问题或答案进行多次投票,但它不会阻止用户进入其浏览器的控制台并手动提交 POST 或 GET 请求以绕过 JS 验证。在不知不觉中,只需回答几个问题,您就会看到拥有 100k 声誉的 Lloyd Banks

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-11
        • 2020-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多