用户名中的有效字符应该是什么?

时间:2010-01-12 23:44:55

标签: authentication standards special-characters

许多基于Web的用户身份验证系统不允许包含字母,数字和下划线以外的字符的用户名。

可能有技术原因吗?

10 个答案:

答案 0 :(得分:16)

精心设计的系统不一定需要阻止用户名中的任何特殊字符。

也就是说,下划线传统上被接受的原因是下划线通常被视为“单词”字符,以及字母和数字。它通常是给予这种区别的唯一其他角色。在正则表达式中也是如此,即使在大多数操作系统的基础级别也是如此(在单词中键入下划线并双击字母。选择将延伸到下划线。现在尝试使用短划线,它很可能会不。)

答案 1 :(得分:14)

是:避免必须转义特殊字符。懒惰的程序员只会将用户输入的内容直接删除到某个地方的代码中,这就是导致注入攻击的原因。

即使它没有被恶意使用,允许用户输入会在其他地方发生冲突的字符也可能比必要的更麻烦。例如,如果您决定为每个用户创建一个文件系统目录,以存储其上载,则用户名必须符合该操作系统上的目录命名规则(例如,Windows上没有\/:*?"<>|)。

一旦你避免了像目录命名之类的冲突,并剥离"';%//以避免注射攻击,你已经删除了大多数标点符号,并且“为什么有人甚至需要标点符号用户名“?

编写快速正则表达式来验证[a-zA-Z0-9_]的用户名并使用它完成要容易得多,而不是弄清楚所有可能不会发生冲突的标点符号,或者将它们映射到某些字符串中。方式。

然后,就像计算机中的许多东西一样,只要有足够的人开始只有用户名的字母,数字和下划线,并且人们开始为该规范制作用户名,它就成了事实上的标准并且自我延续!

答案 2 :(得分:7)

未指定时,我使用:

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

这需要长度为4,最多32个字符。它必须以单词字符开头,并且可以具有非连续的点和短划线。我使用它的唯一原因是因为它足够严格,可以与几乎任何东西集成:)

有效:

  

test.tost

无效:

  

test..tost

答案 3 :(得分:4)

将它限制为这些字符(甚至是它们的ASCII子集)可以防止用户名被接受。通过不接受这些字符,您可以阻止大范围或用户名 - 看起来像其他用户名。

答案 4 :(得分:3)

因为它允许以一种可读的方式表示多个单词。

Peronally我真的,真的希望人们会扩展一些东西以允许破折号和撇号。这将允许人们使用非英语语音名称(例如:美国原住民部落名称,如She-Ki和Ke`Xthsa-Tse)

答案 5 :(得分:3)

我不喜欢可读性论点,因为它干扰了人们在用户名中使用母语的能力。

我建议您尝试使用包含http://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedUnicodeGeneralCategorieshttp://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedNamedBlocks的字符类。我没试过,但是

[\p{L}\p{N}\p{M}]

可能值得一个实验。

答案 6 :(得分:2)

网站实施此类规则的主要原因是可读性(因为像~-|this<>one|-~这样的用户名很烦人)。这可能也是因为它的工作量较少(下划线与\w+正则表达式匹配,而破折号和其他特殊字符则没有),但我怀疑这是一个主要原因。

没有“标准”,所以如果上述两种原因都不能打扰你,那就做你想做的事。我个人希望看到更多的网站接受破折号和句号,但这实际上是个人对可读性和一致性与表达的偏好。

答案 7 :(得分:1)

取决于您的用户名的使用方式。在不了解背景的情况下,没有一般规则。

答案 8 :(得分:1)

传统上,大多数编程语言都允许使用Underscore标识符,并且通常允许使用唯一的“特殊”字符 但许多网络登录仍然不接受任何特殊字符,并限于大写/小写字符和数字...
其他的都很好,有特别的; - )

答案 9 :(得分:0)

人们可能想要写出他们的用户名,而不是像这样或者喜欢这样的用户名。