实际用户验证(灵敏度和特异性)?
Practical user validation (sensitivity and specificity)?
当我第一次学习如何使用正则表达式时,我们被教导如何解析诸如 phone 数字(显然总是 5 位数字,一个可选的 space 和另外 6 位数字),电子邮件地址(显然总是字母数字,然后是单个“@”,然后是字母数字后跟“.”和三个字母)我们应该始终这样做以验证用户输入的数据。
当然,随着我的发展,我了解到基本方法可能是多么愚蠢,但我看得越多,我就越质疑这个概念,最开放的仔细正确验证诸如电子邮件地址之类的东西通过正则表达式最终会达到数百甚至数千个字符的长度,以便接受所有合法案件并正确拒绝非法案件。更糟糕的是,所有这些努力对实际有效性完全没有任何帮助,用户可能不小心添加了 'a',或者可能根本不使用该电子邮件地址,甚至可能使用其他人的地址,甚至可能使用“+”符号被不当标记。
然而与此同时,似乎我遇到的每个网站仍然进行这种技术检查,阻止我在电子邮件地址或名称中添加更多晦涩的字符,或者反对某人或多或少的想法不是单一的头衔,然后是单一的名字和单一的姓氏,所有这些都是纯粹由拉丁字符组成的,但没有任何形式的检查这是我的真名。
这有什么好处吗? 一旦处理了注入攻击(应该通过对输入进行消毒以外的方法),这些检查还有其他意义吗?
或者另一方面,除了 'use' 以任何在上下文中有意义的方式验证用户详细信息并查看它是否失败之外,是否真的有可靠的方法来实际验证用户详细信息?
is there any other point to these checks?
当然可以。知道您的数据是有效的非常重要。例如,在电子邮件地址的情况下,将电子邮件发送到您尚未验证的地址至少会导致退回。足够多的反弹和您的邮件主机可能会阻止您发送垃圾邮件。如果您的应用试图向他们发送短信,则不验证 phone 号码可能会导致不必要的费用。清单还在继续。
Or on the other hand, is there actually a sure fire way to actually validate user details other than to 'use' them in whatever way makes sense contextually and see if it falls over?
是的,但正则表达式通常不是验证数据的好方法。如果 phone 号码应该是“5 位数字 a space 然后 6 位数字”,那么如果我键入“5 位数字两个 space 然后 6 位数字”,您的检查将会失败或“5 位数字破折号,然后 6 位数字”或“11 位数字”。使用常识,并期待用户提供的任何疯狂格式。知道绝对最低要求是什么。例如,如果您总共需要 11 位数字,则首先去除不是数字的所有内容。那么格式就无所谓了。
此外,请阅读 RFC。我无法计算我的电子邮件地址被拒绝的次数,因为它有一个加号。那些拥有应该更了解程序员的大型技术公司的数量相当令人失望。
过度验证事物确实是互联网的祸根之一。特别是如果编写验证代码的人对问题领域没有实际了解。不,您可能 而不是 实际上知道电子邮件地址的有效语法是什么。或真实世界的地址,尤其是国际地址。或电话号码。 Or people's names.
查看几个本地化示例(我的电子邮件地址)并推断出涵盖域(所有电子邮件地址)内所有 可能值的规则是疯狂的。除非你拥有完美的领域知识,否则你不应该提出关于领域的规则。在电子邮件地址的情况下,这导致在日常生活中实际可用的可能电子邮件地址的子集非常小。酥油,谢谢,伙计们。
至于人的名字,一个人告诉你什么是他们的名字就是他们的名字。这就是你对他们的称呼。您无法自动验证它;他们必须发送出生证明的副本以进行实际的官方验证。即便如此,这真的是你有兴趣知道的吗?或者您只需要 "handle" 在您的论坛页面上问候和识别他们?
Facebook 会(做过?)严格的名称验证,以强制人们使用真实姓名进行注册。好吧,我在 Facebook 上认识的很多人仍然使用一些胡编乱造的名字。过滤器显然不起作用。话虽如此,也许它对 Facebook 足够好,所以 大多数 人都使用他们的真实姓名,因为他们不会费心去弄清楚哪个特定模式将通过验证。从这个意义上说,这样的过滤器可以达到某些目的。
最终由您决定验证的原因和您要执行的具体限制。问题在于,人们在编写验证代码之前通常不会考虑全局,并且他们没有充分的理由来限制他们的具体限制。不要落入那个陷阱。
当我第一次学习如何使用正则表达式时,我们被教导如何解析诸如 phone 数字(显然总是 5 位数字,一个可选的 space 和另外 6 位数字),电子邮件地址(显然总是字母数字,然后是单个“@”,然后是字母数字后跟“.”和三个字母)我们应该始终这样做以验证用户输入的数据。
当然,随着我的发展,我了解到基本方法可能是多么愚蠢,但我看得越多,我就越质疑这个概念,最开放的仔细正确验证诸如电子邮件地址之类的东西通过正则表达式最终会达到数百甚至数千个字符的长度,以便接受所有合法案件并正确拒绝非法案件。更糟糕的是,所有这些努力对实际有效性完全没有任何帮助,用户可能不小心添加了 'a',或者可能根本不使用该电子邮件地址,甚至可能使用其他人的地址,甚至可能使用“+”符号被不当标记。
然而与此同时,似乎我遇到的每个网站仍然进行这种技术检查,阻止我在电子邮件地址或名称中添加更多晦涩的字符,或者反对某人或多或少的想法不是单一的头衔,然后是单一的名字和单一的姓氏,所有这些都是纯粹由拉丁字符组成的,但没有任何形式的检查这是我的真名。
这有什么好处吗? 一旦处理了注入攻击(应该通过对输入进行消毒以外的方法),这些检查还有其他意义吗?
或者另一方面,除了 'use' 以任何在上下文中有意义的方式验证用户详细信息并查看它是否失败之外,是否真的有可靠的方法来实际验证用户详细信息?
is there any other point to these checks?
当然可以。知道您的数据是有效的非常重要。例如,在电子邮件地址的情况下,将电子邮件发送到您尚未验证的地址至少会导致退回。足够多的反弹和您的邮件主机可能会阻止您发送垃圾邮件。如果您的应用试图向他们发送短信,则不验证 phone 号码可能会导致不必要的费用。清单还在继续。
Or on the other hand, is there actually a sure fire way to actually validate user details other than to 'use' them in whatever way makes sense contextually and see if it falls over?
是的,但正则表达式通常不是验证数据的好方法。如果 phone 号码应该是“5 位数字 a space 然后 6 位数字”,那么如果我键入“5 位数字两个 space 然后 6 位数字”,您的检查将会失败或“5 位数字破折号,然后 6 位数字”或“11 位数字”。使用常识,并期待用户提供的任何疯狂格式。知道绝对最低要求是什么。例如,如果您总共需要 11 位数字,则首先去除不是数字的所有内容。那么格式就无所谓了。
此外,请阅读 RFC。我无法计算我的电子邮件地址被拒绝的次数,因为它有一个加号。那些拥有应该更了解程序员的大型技术公司的数量相当令人失望。
过度验证事物确实是互联网的祸根之一。特别是如果编写验证代码的人对问题领域没有实际了解。不,您可能 而不是 实际上知道电子邮件地址的有效语法是什么。或真实世界的地址,尤其是国际地址。或电话号码。 Or people's names.
查看几个本地化示例(我的电子邮件地址)并推断出涵盖域(所有电子邮件地址)内所有 可能值的规则是疯狂的。除非你拥有完美的领域知识,否则你不应该提出关于领域的规则。在电子邮件地址的情况下,这导致在日常生活中实际可用的可能电子邮件地址的子集非常小。酥油,谢谢,伙计们。
至于人的名字,一个人告诉你什么是他们的名字就是他们的名字。这就是你对他们的称呼。您无法自动验证它;他们必须发送出生证明的副本以进行实际的官方验证。即便如此,这真的是你有兴趣知道的吗?或者您只需要 "handle" 在您的论坛页面上问候和识别他们?
Facebook 会(做过?)严格的名称验证,以强制人们使用真实姓名进行注册。好吧,我在 Facebook 上认识的很多人仍然使用一些胡编乱造的名字。过滤器显然不起作用。话虽如此,也许它对 Facebook 足够好,所以 大多数 人都使用他们的真实姓名,因为他们不会费心去弄清楚哪个特定模式将通过验证。从这个意义上说,这样的过滤器可以达到某些目的。
最终由您决定验证的原因和您要执行的具体限制。问题在于,人们在编写验证代码之前通常不会考虑全局,并且他们没有充分的理由来限制他们的具体限制。不要落入那个陷阱。