28

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

这可能有技术原因吗?

4

10 回答 10

20

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

也就是说,下划线传统上被接受的原因是下划线通常与字母和数字一起被视为“单词”字符。它通常是唯一给出这种区别的其他字符。这在正则表达式中是正确的,甚至在大多数操作系统中也是如此(在单词中输入下划线并双击字母。选择将超出下划线。现在尝试使用破折号进行相同操作,它很可能会不是。)

于 2010-01-12T23:48:39.523 回答
17

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

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

一旦您避免了目录命名之类的冲突,并剥离"';%//避免注入攻击,您就删除了大多数标点符号,以及“为什么有人甚至需要在他们的用户名中使用标点符号”?

编写一个快速的正则表达式来验证用户名[a-zA-Z0-9_]并使用它要容易得多,而不是费力地找出所有可能不会发生冲突的标点符号,或者以某种方式将它们映射到其他字符。

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

于 2011-10-24T12:35:10.940 回答
9

当未指定时,我使用这个:

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

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

(原始正则表达式)

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

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

有效的 :

测试.tost

无效的 :

测试..tost

于 2010-01-12T23:57:30.097 回答
7

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

于 2011-03-06T03:25:43.793 回答
5

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

我建议您尝试使用包含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}]

可能值得一试。

于 2010-01-13T00:17:13.443 回答
3

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

就我个人而言,我真的非常希望人们能稍微扩展一下以允许使用破折号和撇号。这将允许人们使用非英语拼音名称(例如:She-Ki 和 Ke`Xthsa-Tse 等美洲原住民部落名称)

于 2010-01-12T23:48:05.777 回答
2

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

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

于 2010-01-12T23:50:49.860 回答
1

取决于您的用户名的使用方式。没有一般规则,不知道上下文。

于 2010-01-12T23:47:34.953 回答
1

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

于 2010-01-12T23:50:55.273 回答
0

人们可能想写他们的用户名 like_this 而不是 likethis 或 LikeThis。

于 2010-01-12T23:47:53.673 回答