回答
精心设计的系统并不一定需要防止用户名中的任何特殊字符。
也就是说,原因强调传统上被接受,是下划线通常被视为一个“单词”字符,连同字母和数字。鉴于这种区别,它通常是唯一的其他角色。在正则表达式中,甚至在大多数操作系统的基本级别都是如此(在一个单词中键入下划线并双击字母,选择将延伸超过下划线。现在尝试使用短划线,这很可能会不是)
取决于您的用户名的使用方式。没有一个通用规则,不知道上下文。
人们可能想写他们的用户名like_this而不是likethis或LikeThis。
因为它允许以可读的方式表示多个单词。
Peronally我真的,真的希望人们会扩大一些东西,允许破折号和撇号。这将允许人们使用非英语拼音名称(例如:美国土着部落名称,例如She-Ki和Ke`Xthsa-Tse)
我最糟糕的shell脚本噩梦成真 – glyph 2017-01-02 19:15:57
网站强制执行这些规则的主要原因是可读性(因为用户名像~-|this<>one|-~
令人讨厌)。这也可能是因为它的工作较少(下划线通过\w+
正则表达式匹配,而破折号和其他特殊字符则不匹配),但我怀疑这是一个主要原因。
没有“标准”,所以如果上述原因都没有打扰您,请做任何您想要的。就我个人而言,我希望看到更多的网站接受破折号和时段,但这实际上是可读性和一致性与表达的个人偏好。
字符限制的另一个好的理由是防止用户伪造。当你有一个知名用户(“例子”)的社区时,有人可能会出现并以“例子”的形式发布。欺骗那些没有进一步看待个人资料的人。这在维基百科上发生了很多 - 查看用户列表:http://en.wikipedia.org/w/index.php?title=Special:ListUsers&username=Jimbo%20Wales) – Nicole 2010-01-13 00:06:05
@Renesis:是的,但你可以无论如何,在名称的末尾添加一个数字。当然,这比一段时间更明显,但无论您添加到系统中的字符限制如何,它都可以工作。 – 2010-01-13 00:09:10
下划线传统上允许用大多数编程语言的标识符,并且通常是唯一允许的“特殊”字符。
但许多网站的登录仍然不接受任何特殊字符,并仅限于小写/大写字符和数字...
而其他都是用细真的很特别的人;-)
没有规定当我使用这个:
^\w(?:\w*(?:[.-]\w+)?)*(?<=^.{4,32})$
这需要长度为4且最多32个字符。它必须以单词字符开头,并且可以有不连续的点和破折号。我用这个的唯一原因是因为它不够严谨与几乎所有的东西:)
有效整合:
test.tost
无效:
测试..tost
嗯,所以Unicode字符可以吗?我经常想知道人们是否在他们的用户名中使用了Unicode字符,或者为了简单起见,系统是否完全阻止了它。 – Trejkaz 2012-02-13 03:10:20
我不喜欢可读性参数,因为它会干扰人们在用户名中使用其母语的能力。
我建议你使用纳入http://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedUnicodeGeneralCategories或http://msdn.microsoft.com/en-us/library/20bw873z.aspx#SupportedNamedBlocks的字符类进行实验。我还没有试过,但是
[\p{L}\p{N}\p{M}]
可能是值得一试的。
将它限制为这些字符(甚至是它们的ASCII子集)可以防止用户名被接受。通过不接受这些字符,您可以防止广泛的用户名或用户名 - 看起来像其他用户名。
是:避免必须转义特殊字符。懒惰的程序员只会放弃用户输入的内容,直接进入代码中,这就是导致注入攻击的原因。
即使没有恶意使用它,允许用户输入在其他地方会冲突的字符也可能比必要的更麻烦。例如,如果您决定为每个用户创建一个文件系统目录,要将其上传内容存储在其中,则用户名必须符合该操作系统上的目录命名规则(例如,Windows上没有\/:*?"<>|
)。
一旦您避免了冲突(如命名目录),并且删除了"';%
和//
以避免注入攻击,您已经删除了大部分标点符号和“为什么某人甚至需要在其用户名中标点符号”?
写一个快速正则表达式来验证用户名对[a-zA-Z0-9_]
并且用它来完成要比查找所有可能的不会冲突的标点符号或以某种方式将它们映射到其他字符更容易。然后,就像计算中的许多事情一样,只要有足够多的人开始为用户名开始提供字母,数字和下划线,并且人们开始制作用户名以符合该规范,它就成为了事实上的标准和自我延续!
@CarlosMuñoz:最初的问题是询问在很多网络系统上如何严格限制可能的原因。 很明显,建立一个可以接受其他角色的系统是可能的,但最初的问题是问为什么并非总是如此。 – Rikki 2013-09-27 14:17:57
- 1. Java方法名称的有效字符是什么?
- 2. 宏名称的有效字符是什么?
- 3. 什么是“字符串与诠释”应该是什么意思?
- 4. 按名称浏览用户的有效方法是什么?
- 5. 为什么'\ 117'在Java中是有效的字符文字?
- 6. 用户代理字符串:我应该捕获什么?
- 7. 什么是允许的字符Snapchat的用户名
- 8. 什么字符在URL中有效?
- 9. 什么样的用户名应该在sql server 2005中给出?
- 10. 什么字符在SQL Server数据库名称中有效?
- 11. 该用户决定的预期行为应该是什么?
- 12. 什么字符应该在sql字符串参数中转义
- 13. css的名字应该是?
- 14. 什么是替换字符串中多个字符的有效方法?
- 15. 应该将字符串转换为NSDate的格式是什么?
- 16. KeyValuePair的查询字符串应该是什么样子?
- 17. Django:什么是`sys.path`应该是什么?
- 18. 配置OpenSSH时应该使用什么用户名?
- 19. 999x数字应该是什么Regx?
- 20. 我应该使用什么字符来替换URL中的非法字符slug
- 21. Python类名中的有效字符
- 22. 而不是客户的名字,我该怎么让客户
- 23. 什么是更有效的处理这个字符串
- 24. 将ifstream读入字符串的最有效方法是什么?
- 25. 什么是空数组项的有效查询字符串?
- 26. Mime Multipart消息ContentId“CID:”的有效字符是什么?
- 27. 连接字符串的最有效方法是什么?
- 28. 比较两个字符串的最有效方法是什么?
- 29. 什么是进行字符串比较最有效的方法?
- 30. 什么名字应该有getter和setter方法
那些不容易阅读的字符或者让系统变得凌乱的字符是不容许的候选人。像@ @#$%这样的用户名会很糟糕。 – Veger 2010-01-12 23:50:51
尽管Veger的评论从可用性的角度来看是有效的,但它忽略了Renesis点,这是一个技术问题:构成“用户名”的内容没有固有的技术限制。 – 2010-01-12 23:53:45
“精心设计的系统”有一天可能会遇到现实世界的集成和安全案例。域名,电子邮件,文件名和其他有限制的系统。 [Unicode用户名](http://unicode.org/reports/tr36/)存在很多安全问题,如[Spotify]所示(https://labs.spotify.com/2013/06/18/ creative-usernames /)可能会有同样的想法。要解决所有这些问题,只需遵循[POSIX.1-2008](http://serverfault.com/a/578264/226737)便携式用户名的标准。 – saaj 2016-08-31 15:26:25