当我第一次学习如何使用正则表达式时,我们被教导如何解析电话号码(显然总是5位数,可选空格和另外6位数),电子邮件地址(显然总是字母数字,然后是单个& #39; @',然后是字母数字,然后是'。'和三个字母),我们应该始终这样做以验证用户输入的数据。
当然,正如我已经发展的那样,我已经了解到基本方法有多么愚蠢,但我看的越多,我就越对这个概念提出质疑,最开放的仔细正确验证通过正则表达式的电子邮件地址最终会有数百个(如果不是数千个)字符长,以便接受所有合法案件并正确拒绝非法的案件。更糟糕的是,所有这些努力对于实际有效性绝对没有任何作用,用户可能不小心添加了“a”,或者可能根本不使用该电子邮件地址,甚至使用其他人的#a;地址,甚至可能使用' +'被不当标记的符号。
然而,与此同时,我遇到的每个网站似乎都会进行这种技术检查,阻止我在电子邮件地址或名称中添加更多不起眼的字符,或者反对某人会有多于或少于一个人的想法单个标题,然后是单个名字和单个姓氏,所有这些都完全由拉丁字符制成,但没有任何形式的检查它是我的真名。
这有什么好处?一旦处理了注入攻击(应该通过除输入消毒之外的其他方法),还有其他指向这些检查吗?
或者另一方面,除了使用'之外,实际上是否确实有一种实际验证用户详细信息的方法。它们以任何方式在上下文中有意义,看看它是否会失效?
答案 0 :(得分:17)
过度验证事实确实是互联网的祸根之一。特别是如果编写验证码的人没有对问题域的实际了解。不,您可能不实际上知道电子邮件地址的有效语法是什么。或现实世界的地址,尤其是国际地址。或电话号码。 Or people's names.
查看一些本地化示例(我的电子邮件地址)并推断出涵盖域内所有可能值(所有电子邮件地址)的规则是疯狂的。除非您拥有完善的领域知识,否则您不应该提出有关域名的规则。在电子邮件地址的情况下,这导致在日常生活中实际可用的可能电子邮件地址的非常窄的子集。哎呀,谢谢,伙计们。
至于人名,无论一个人告诉你的是他们的名字都是他们的名字。这就是你所说的。您无法自动验证 ;他们必须发送出生证明副本以进行实际的官方验证。即便如此,这真的是你真正想知道的吗?或者你只是需要一个"句柄"在论坛页面上问候并识别它们?
Facebook确实(确实?)严格的名称验证,以强迫人们使用他们的真实姓名进行注册。好吧,我在Facebook上认识的很多人仍然使用一些无意义的名字。过滤器显然不起作用。说到这一点,也许它对于Facebook来说已经足够,所以大多数人都会使用他们的实际名称,因为他们无法弄清楚哪个特定模式会通过验证。从这个意义上讲,这样的过滤器可以用于某些目的。
最后,您需要决定验证的原因以及要强制执行的 特定限制 。问题是人们在编写验证代码之前通常不会考虑更大的图景,而且他们的特定限制 没有充分的理由 。不要陷入陷阱。
答案 1 :(得分:0)
这些检查还有其他意义吗?
当然可以。知道您的数据有效非常重要。例如,对于电子邮件地址,向您尚未验证的地址发送电子邮件至少会导致退回。足够的反弹和您的邮件主机可能会阻止您发送垃圾邮件。如果您的应用尝试向他们发送短信,则不验证电话号码可能会导致不必要的费用。这个清单一直在继续。
或者另一方面,除了使用'之外,实际上是否确实有一种实际验证用户详细信息的方法。它们以任何方式在上下文中有意义,看看它是否会失效?
是的,但正则表达式通常是验证数据的不好方法。如果电话号码应该是" 5位数,一个空格,然后是6位",那么如果我键入" 5位数2个空格然后6个数字"则检查将失败。或者" 5位数字破折号,然后是6位数字"或" 11位"。使用常识,并期望用户提供任何疯狂的格式。知道绝对最低要求是什么。例如,如果您总共需要11个数字,那么首先删除所有不是数字的内容。然后格式化并不重要。
另外,请阅读RFC。我无法计算我的电子邮件地址被拒绝的次数,因为它有一个加号。对那些应该知道更好的程序员来说,那些大型技术型公司的数量相当令人失望。