用户名中应该包含哪些有效字符?

31
许多基于Web的用户身份验证系统不允许用户名包含除字母、数字和下划线之外的字符。这是否可能有技术原因?
10个回答

19

一个设计良好的系统不一定需要防止任何特殊字符在用户名中出现。

尽管如此,下划线之所以通常被接受,是因为它通常被视为“单词”字符,与字母和数字一样。在正则表达式中,它通常是唯一被赋予这种特殊性质的字符。即使在大多数操作系统的基本级别上也是如此(在单词中键入下划线并双击字母,选择将扩展到下划线之后。现在尝试使用破折号进行相同的操作,很可能不会成功)。


9
不易阅读或会使系统混乱的字符应该被禁止作为用户名。例如,类似于!@#$%这样的用户名就不好。 - Veger
6
尽管Veger的评论在可用性方面是有效的,但它忽略了Renesis的观点,即这是一个技术问题:“用户名”没有固有的技术限制。 - G-Wiz
7
"精心设计的系统"有一天会遇到真实世界中的集成和安全问题。域名、电子邮件、文件名等系统都有其限制。 Unicode用户名存在许多安全问题,如Spotify所展示的那样,他们也可能认为这是正确的方式。要解决所有这些问题,可以只需遵循可移植用户名的标准POSIX.1-2008 - saaj

17

是的: 为了避免需要转义特殊字符. 懒惰的程序员会将用户输入的内容直接放入代码中,这就导致了注入攻击。

即使没有恶意使用,允许用户输入与其他地方冲突的字符可能会带来更多不必要的麻烦。例如,如果你决定为每个用户创建一个文件系统目录来存储他们的上传文件,那么用户名必须符合该操作系统上的目录命名规则(例如,在Windows上不能包含 \ / : *?"<>| 字符)。

一旦你避免了像目录命名这样的冲突,并去除了"';%//以避免注入攻击,你就已经删除了大部分标点符号,“为什么有人甚至需要在他们的用户名中使用标点符号呢?”

编写一个快速的正则表达式来验证用户名是否符合 [a-zA-Z0-9_] 比费尽心思弄清所有不可能导致冲突的标点符号或以某种方式映射它们到其他字符要容易得多。

然后,就像计算机中的许多事情一样,一旦足够多的人只使用字母、数字和下划线作为用户名,并且人们开始按照这个规范创建用户名,它就成为了事实上的标准并自我延续!


1
@CarlosMuñoz:原问题询问许多Web系统限制如此严格的可能原因。显然,可以构建接受其他字符的系统,但原问题是在问为什么不总是这种情况。 - Rikki
除了这些原因,对于用户本身来说,在用户名中使用特殊字符也是一种痛苦吧?为大多数人输入带有重音或其他特殊字符的名称可能是一种挑战! - Ciaran Gallagher

9

如果没有指定,我会使用这个:

(更新了正则表达式以修复@abney317提到的回溯问题backtracking)

^\w(?:\w|[.-](?=\w)){3,31}$

(原始正则表达式)

^\w(?:\w*(?:[.-]\w+)?)*(?<=^.{4,32})$

这需要长度为4,最大可达32个字符。它必须以字母数字字符开头,并且可以包含非连续的点和破折号。我之所以使用这个规则是因为它严格到足以与几乎任何东西集成 :)

有效:

test.tost

无效:

test..tost


哦,所以Unicode单词字符可以使用吗?我经常想知道人们是否在用户名中使用Unicode字符,或者系统是否为简单起见直接阻止。 - Hakanai
1
这个正则表达式存在回溯问题,会因过多的递归导致浏览器死锁。 - abney317

7

限制用户名只能使用这些字符(甚至是它们的ASCII子集)可以防止像 这样的用户名被接受。通过不接受这些字符,您可以防止一系列看起来像其他用户名的用户名。


5

3
因为它允许多个单词以某种可读的方式表示。
个人而言,我真的非常希望人们能够扩展一下,允许使用破折号和撇号。这将允许人们使用非英语语音名称(例如:像She-Ki和Ke`Xthsa-Tse这样的美洲原住民部落名称)。

1
我的最糟糕的Shell脚本噩梦成真了。 - 111

2
网站强制执行这些规则的主要原因是为了易读性(因为像~-|this<>one|-~这样的用户名很烦人)。也可能是因为它更少的工作量(下划线可以通过\w+正则表达式匹配,而破折号和其他特殊字符不行),但我怀疑这不是主要原因。
没有“标准”,所以如果以上两个原因都不影响您,请随意使用。个人认为,我希望看到更多的网站接受破折号和句点,但这实际上是易读性和一致性与表达个性之间的个人偏好。

字符限制的另一个好处是防止用户伪造。当你有一个知名用户(“Example”)的社区时,有人可能会冒充“Example”发布帖子,以欺骗那些没有深入查看个人资料的人。这在维基百科上经常发生-看看用户列表:http://en.wikipedia.org/w/index.php?title=Special:ListUsers&username=Jimbo%20Wales - Nicole
2
@Renesis:是的,但你仍然可以在名称末尾添加一个数字。当然,它比句点更明显,但无论您向系统添加什么字符限制,它都可以工作。 - Sasha Chedygov

1

这取决于你的用户名是如何使用的。如果不知道上下文,就没有通用规则。


1

在大多数编程语言中,下划线通常被允许用于标识符,并且通常是唯一允许的“特殊”字符。
但许多Web登录仍然不接受任何特殊字符,限制为小写/大写字符和数字...
而其他则可以使用非常特殊的字符;-)


0

人们可能希望将他们的用户名写成这样,而不是像这样或者像这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接