【问题标题】:What is the proper way to validate user input?验证用户输入的正确方法是什么?
【发布时间】:2015-07-11 22:08:53
【问题描述】:

我完全理解应该使用 JavaScript 来增强用户体验,但是我有时会使用它来验证输入,例如检查密码文本框是否超过 5 个字符或检查用户名文本框中输入的用户名是否已经存在。可以想象,如果密码少于 5 个字符或者用户名已经存在,注册按钮就会被禁用。

但是,这可以通过用户浏览器进行更改,那么他们有更好的方法来验证用户的输入吗?

我知道我可以通过服务器验证这一切,只需在单击注册按钮时检查文本框,但肯定它们必须是更好的方式,因为用户无法更改?

顺便说一句:我正在使用 Visual Studio C# ASP.NET

另外,我认为正则表达式也可以在客户端更改是否正确

【问题讨论】:

  • 您正确地假设来自客户端的所有内容都是不受信任的。即使是单选按钮组或复选框,如果不编辑 dom 就无法修改。是的,可以修改正则表达式。您需要客户端(UX 观点)和服务器端(实际安全)验证。
  • 基本规则是从不信任用户。您放置在浏览器中的任何内容在离开您的服务器后都可以被任何人操作。因此,公认的做法是仅将客户端验证作为用户体验机制,将服务器端验证作为实际验证。
  • 无论您在客户端做什么或不做什么,您都应该进行严格的服务器端输入检查。服务器是您抵御非法输入的最后——也是最好的——防御。是的,几乎任何东西都可以在客户端进行更改。 URL 和 HTTP 有效负载也是如此。这并没有降低使用 Javascript 正则表达式的效率......什么都不相信;)
  • 您可以通过使用 Web 浏览器中的开发人员工具(按 F12)来编辑 HTML 和 JavaScript 来探索这一点。来吧,绕过一些客户端验证。
  • 独立于服务器端验证的需要,我认为值得一提的是,您应该只对客户端可以做的事情进行客户端验证。密码的长度当然是其中之一。检查用户名是否存在肯定是没有的。在任何情况下,客户端都不应知道现有的用户名,并且客户端验证不应导致任何服务器往返。

标签: javascript c# asp.net validation


【解决方案1】:

应在客户端和服务器上进行验证。如果您选择不使用内置验证的框架,您绝对可以编写自己的正则表达式来执行此操作。

可以绕过客户端验证,其主要目的是用户体验。 See here。服务器端验证更难绕过。

【讨论】:

【解决方案2】:

永远不要依赖客户端验证。必须始终进行双重检查,一项在客户端,一项在服务器端。 Java 脚本、J 查询和正则表达式可以为您做到这一点。作为旁注,请使用参数查询。

【讨论】:

    【解决方案3】:

    确实,客户端代码的本质是可操作的。您可以通过使用函数的 Private 和 Privileged 成员来接近防止通过控制台更改代码。 在构造函数中,特权方法被分配this,并且只调用私有变量。以 crockford.com 中的这个例子为例,

    function Container(param) {
    
        function dec() {
            if (secret > 0) {
                secret -= 1;
                return true;
            } else {
                return false;
            }
        }
    
        this.member = param;
        var secret = 3;
        var that = this;
    
        this.service = function () {
            return dec() ? that.member : null;
        };
    }
    

    服务函数具有特权,可以调用私有dec() 方法,该方法可以访问私有secret 变量。 service 是一种特权方法,因为如果直接调用,它将返回 null.service 而不是它有权访问的变量的期望值 secret

    您可以在评估密码时利用这一优势,因为服务器端代码可能需要特定的结构化数据,如果没有适当的 javascript,这些数据根本不会被接受。

    【讨论】: