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

Ema*_*sev 22 authentication standards special-characters

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

可能有技术原因吗?

Nic*_*ole 16

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

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

  • 好的字符不容易阅读或使系统混乱的字符是不允许的好选择.像!@#$%这样的用户名会很糟糕. (7认同)
  • 虽然Veger的评论从可用性的角度来看是有效的,但是它错过了Renesis点,这是一个技术问题:对于构成"用户名"的内容没有固有的技术限制. (5认同)
  • 有一天,"精心设计的系统"可能会遇到真实的集成和安全案例.域名,电子邮件,文件名和其他有限制的系统.[Unicode用户名](http://unicode.org/reports/tr36/)存在许多安全问题,如[Spotify]所示(https://labs.spotify.com/2013/06/18/创意用户名/)可能有同样的想法.要解决所有这些问题,可以按照[POSIX.1-2008](http://serverfault.com/a/578264/226737)标准获取便携式用户名. (4认同)

Rik*_*kki 14

是的:避免不得不逃避特殊字符.懒惰的程序员只会将用户输入的内容直接删除到某处的代码中,这就是导致注入攻击的原因.

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

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

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

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


Dia*_*tis 7

未指定时我使用:

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

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

有效期:

test.tost

无效:

test..tost


小智 7

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


Joh*_*ers 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}]
Run Code Online (Sandbox Code Playgroud)

可能值得一试。