我从 Reply All 的 Alex Goldman 那里得知(一个超级棒的播客,故事大多起源于互联网)
我们正在做一个关于那些名字会导致网站和电脑无法正常运行的人的故事——例如,我们采访了一个名叫 William Test 的男人和一个名叫 Katie Test 的女人,他们似乎都无法预订酒店或飞机,因为名字中的“test”被内部系统标记了。
我们还采访了一个名叫 Christopher Null 的男人,他遇到了同样的问题,以及一个名叫 Joan Fread 的女人,她无法使用 PayPal,因为她的姓与一个 PHP 命令相同。
我很好奇,开发社区是否有任何人正在思考这个问题,以及如何处理它。 这个问题甚至算得上是一个问题吗? 受到影响的人口数量是否如此之小,以至于人们甚至不会考虑它呢?
我回复了,但那是几个月前的事了,我还没有收到任何回复。 我认为我应该把我的回复发布在这里,因为它确实是一个很有趣的话题,也许通过这里的评论,我们可以激发一些他可以使用的有趣内容。
这是我的回复
归根结底,这是糟糕的编程。 任何软件都不应该接受一个名字输入并在任何时候将其视为代码。 如果你的姓氏像 著名的 XKCD 漫画 一样,在一个设计良好的系统中,这应该没问题。
有一些正当的理由可以“标记”名字。 在我的公司 (CodePen),我们对包含不良语言的名字进行标记。 你不能以 “Sh*tf*cker Dirtyballs” 的名字注册。 我们是故意这么做的,目的是为了营造一个更健康的社区。
名字 和 用户名 是不同的。 对用户名设置更严格的规则要合乎情理一些。 在我们的代码库中,我们有一个名为 “username_blacklist.rb” 的文件,它可以阻止使用很多词语。 这样做不是因为我们担心会覆盖 Ruby 函数或其他什么,而是因为 1) 我们在 URL 中使用用户名,这意味着我们需要保留一些用户名供我们自己使用,2) 再一次,不良语言过滤器。 3) 垃圾邮件。 如果一个用户名包含 “watchsocceronline” (例如),我们会将其标记为垃圾邮件审查。
编程的 “现实世界” 很复杂。 公司编写快速修复问题的 “创可贴代码” 而不是完善代码,这并不奇怪。 编写代码来阻止/标记姓氏为 “delete” 比审核整个代码库以查找该字符串导致问题的场景更容易。
你们对这个问题有什么经验吗?
这必须是在文章中写下 “Sh*tfucker Dirtyballs” 的最佳借口。
对于用户名,我们有一个与 “管理员” 相关的名称列表,我们不允许人们使用,以及与域名相关的名称。 只是为了防止冒充的基本内容,但我们从未真正采取过自动化用户名过滤的措施。 当我们发现更多人使用不合适的用户名注册时,我们会进行一些个案处理。
我们公司去年举办了一场用户生成内容的活动,我们设置了黑名单过滤器来阻止垃圾邮件和攻击性内容。 讽刺的是,在同一天,我们确实收到了来自两个不同男性的反馈,他们无法注册。 他们的名字? Christian 和 Islam。
人们的名字不会破坏网站。 网站的损坏是因为人们的普通名字。 这是一个非常微妙的区别,但这些网站一直都是损坏的,这只是时间问题。 现在是 2017 年了,我们不应该再像 ASCII 是世界上唯一字符集一样进行编码。
是的,我每天都在努力尝试保存我的第二个名字
x’; DROP TABLE users; —
我的名字里有连字符,并且经常收到验证错误,因为名字字段不允许使用特殊字符(什么?)。
电话号码字段不允许使用非数字,甚至在某些情况下不允许使用空格。 邮箱验证不允许通过有效的邮箱地址(真的)。 这些人到底怎么了?
我们正在朝着只保留必填字段和匹配密码的验证方式发展。 这篇文章很好地解释了为什么邮箱验证不起作用,而且很难反驳它的逻辑…
https://hackernoon.com/the-100-correct-way-to-validate-email-addresses-7c4818f24643#.jdwd3j4i4
是的,开发人员到底是怎么通过他们的验证规则告诉我我的名字无效的? 我用它一辈子了,而且我很确定我拼写正确! 对于所有 O'Learys 和 d'Aousts 来说,这有点不公平。
顺便说一下,感谢您提供这篇优秀文章的链接。 一丝理智。 后续文章,关于如何推断用户意图并建议他们可能拼错了邮箱地址,增加了一些复杂性,但它确实提出了一种帮助用户的好方法。
根据我个人的经验,99% 是糟糕的代码,1% 是附带损害。
保留的 (用户) 名字并不那么重要,因为,嗯,呃,应该是一小部分,而且 (很少) 会被使用的 (用户) 名字。
删除代码注入可以在干净、几乎没有附带损害的情况下完成,但非常 罕见的是能做到很好,因为 “我不知道足够的信息,我想要 100% 确定” 的态度,这几乎自然而然地会导致有效的 (用户) 名字被触发为无效。 通常,捷径可以节省开发人员的时间,但几乎肯定会对用户体验造成负面影响。
另一方面,进行干净而强大的安全检查并非没有代价,但一旦开发的代码对给定设计师构建的所有后续站点都有效,因此没有理由不一次性做好。
没有足够多的程序员读过 https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/,更少的人理解转义的重要性
我的名字 (Paul O'Brien) 遇到过很多问题,我甚至不想再提了,因为撇号经常被标记为非法字符。
我不得不更改我的名字,或者猜测他们是否删除了撇号。 有时全名会被接受,但当你再次登录时,登录系统不接受撇号,如果你省略撇号尝试登录,那么你的记录将找不到。
我无法访问我在政府网站上的驾照详细信息,因为他们不知道我是谁,我的一些信用卡也无法处理撇号,所以我只能放弃使用它们!
我的信用卡甚至没有撇号; 我得到两个中间首字母代替 (我的名字是 Paul A D Aoust,显然)。
我最喜欢的是,当一个网站接受我的姓氏,但我在登录时看到
Welcome, Paul d\'Aoust!
时 :) 那时候我知道有人正在使用 PHP,他们的魔法引号设置都乱了。我记得 2000 年代初的一期杂志 (可能是 Wired),他们有一篇关于同样事情的文章。 我认为 Chris Null 的名字在那篇文章中被使用了,但我还记得另一个名字是 Babcock。 一位女士在访问某些过滤了她名字最后 4 个字母的网站时遇到了麻烦。
有时 “Joe Cocker” 会欺骗一些脏话陷阱 (如果存在的话)。
除了有些系统 “不喜欢” 他之外,他的部分歌曲非常棒! :D
有时我会遇到一个与名字略微不同的问题。 我的名字真的很短,有些网站拒绝只有 3 个字母或更少的名称,认为它们不是名字。 有些网站甚至拒绝 “valhead”,认为它太短,不能作为名字或用户名。 在我添加我的中间首字母或其他东西以使我的名字足够长之前,我会对所有这些网站投去鄙视的眼神。
我曾经修复过一个这样的网站。 设计师想让它变得 ajax 风格,而且很聪明。 登录字段中的名字会自动完成 (谷歌搜索风格)。 它根据名字的前 3 个字符进行自动完成。
直到找到匹配项,提交按钮才会被禁用。 因此,只有 2 个字母 (或更短) 的名字的人无法登录。
在我的国家,人们的名字有时只有 2 个字符长,姓氏只有 3 个字符 (像我这个例子名字 ^^)。
承认我已经看到和听说过关于 – 和 ‘ 的问题。 我确实遇到过一个不喜欢我尝试过的任何用户名的网站 LOL 我确信他们不喜欢我最终使用的那个 :-)
很高兴提醒要允许 :-)
techmicHELLe
归根结底,你无法自动化世界上的一切。
如果你去一个真实的报名柜台,并且你报上你的名字是“Maya Nayme”,你会收到对方的一个问题,仅仅是因为这个名字令人困惑。在名字被接受之前,会需要一些交互。
一个报名表单处理程序在遇到困惑时无法进行交互,因此它会直接拒绝(此时)。我认为这并不一定是代码错误或问题。
显然,像 Test 或 Null 这样的名字对于科技系统来说是不幸的,但像 Uvuvwevwevwe Onyetenyevwe Ugwemubwem Ossas (见 https://www.youtube.com/watch?v=fla-QobHzwg)或 Sh*tfucker Dirtyballs 对于正常的、现实生活中的人来说,这些名字也是不适合的。
没有自动化系统能够对每个条目进行真实的或虚假区分。有些系统比其他系统更宽容/灵活,我同意,Test 和 Null 通常应该被允许。
哦,还记得我无法访问一个网站的那次吗?因为它的源代码中有一个类名“bottom”,所以它被标记为脏数据,哈哈哈哈哈
- 叹气 -
我几天前刚开始使用 Reply All,并且正在追赶第一集。听起来是一集非常有趣且令人沮丧的节目。
关于使用黑名单来过滤不合适的用户名的那条评论让我想起了一次我无意中因为使用“specialist”这个词而被一个论坛禁用的经历。结果发现它包含了一种男性增强药物的名称(在 E 和 T 之间),而他们的过滤器没有检查单词边界。
我必须承认,我之前使用过黑名单来过滤内容,但我至少检查了单词边界。它被用来过滤推文,但在这种情况下,原始推文仍然被保存到数据库中,只有过滤后的推文被显示出来。没有数据丢失!
有些网站拒绝接受我的电子邮件地址(“您必须输入有效的电子邮件地址”),因为我的个人域名以“.us”结尾。
我听说很多中国人都有两个字的姓氏,这会导致验证问题。
还有很多表单不理解电子邮件顶级域名通常超过 3 个字母。早在 2005 年,我们公司的电子邮件以 .travel 结尾,这导致了许多电子邮件验证器失败。我上次查看时,顶级域名可以是 2 到 63 个字符长。
我对验证的最大不满是,像银行这样的重要网站只允许使用短密码(最多 8 个字符)。这些网站让我真正担心他们的安全措施以及他们如何存储密码。
阿门!任何形式的密码规则都让我非常恼火。
让用户使用他们想要的任何密码。如果他们选择不安全的密码,那是他们的问题,而不是你的。你不是他们的母亲 :)
@jonhobbs 唯一应该强制执行的密码规则是最低长度。强制使用数字和所谓的“特殊”字符(它们有什么特别之处,它们只是字符?!)只会迫使用户创建难以记忆的密码,但并不能真正提高其安全性,无法阻止计算机轻松破解。
必须提一下 XKCD:https://xkcd.com/936/
是的,有些人说你必须至少有一个特殊字符,而有些人说你不允许使用特殊字符 :) 我个人喜欢使用密码短语,因为它们易于记忆且相当安全,但有些网站甚至对密码短语的长度有限制。
我使用过一家银行,它在设置账户时接受任何长度的密码,但在登录时却限制为 8 个字符。当我弄明白为什么我的密码不起作用后,我使用 Chrome 的开发者工具删除了 maxlength=”8”,结果就成功了。
我无法告诉你有多少网站不允许我输入我的合法姓名;那个撇号总是会被某个正则表达式捕获。
是的,我的姓氏里有一个 ø。
它通常不被接受,或者被转换为一个 ? 字符。
我恨我的父母。我恨我的中间名。
作为一个姓 O'Donnell 的人,我在填写姓名行时完全不再使用撇号了。它一直是系统难以处理的问题。
这里许多名字的主要问题是使用了撇号。我们已经使用标准的电脑键盘很长时间了,以至于我们忘记了它并不是正确的字符。
如果撇号是正确的排版撇号,那么根本不会出现任何问题(除非主机足够愚蠢地恶意阻止特殊字符,或者他们没有听说过 Unicode)。
在 Mac 上,你可以输入
shift-option-]
,而在 Windows 上,你可以输入alt-1046
。我在注册时总是遇到问题。
太讨厌了!
Christoph
我的同事以前无法注册,因为“姓名不能为空”。他的姓氏是 Blank。
我大致理解 Test 问题(以及特殊字符搞砸的那些问题),但是 Null 和 Fread 呢?我真的不知道如何如此糟糕地搞乱代码,以至于字符串被视为符号,至少不是在没有对像 Smith 这样的普通姓名造成同样糟糕的问题的情况下。