密码中是否允许/不允许使用某些字符?
我将密码存储在db hashed / salted中,并使用PDO来防止注入。我做得还够吗?最近我遇到了一个系统,它不允许一些角色,不记得所有角色,但其中一个是符号&
。他们这样做是出于反数据库注入的原因,还是我还缺少其他东西?密码字符是否应限制在某一组字符或不需要?
答案 0 :(得分:10)
没有技术理由拒绝密码中的任何字符。我想在你描述的情况下,他们只允许字母数字字符来避免用户方面的问题(例如,通过输入另一个国家的键盘上没有的字符)。
许多提供商和网站强制用户选择包含最小数字的非常复杂的密码,有时甚至是偶数特殊字符以防止暴力破解或dictionary attacks。
我不认为强迫人选择复杂的密码是明智的。你不记得的密码,你会在某处写下来,这通常会给现实生活带来更大的安全风险。
登录系统中的简单速率限制(例如,在3次登录尝试失败后拒绝访问15分钟)更加优雅地消除了暴力破坏威胁。
一个人不必100%同意它,但我发现微软研究院关于这个主题的这篇挑衅性论文非常有趣。 So Long, And No Thanks for the Externalities: The Rational Rejection of Security Advice by Users
摘自:
通常建议用户绝望地懒惰 对安全问题没有动力。他们选择弱势 密码,忽略安全警告,并且不知道 证书错误。我们认为用户的拒绝 他们收到的安全建议是完全理性的 从经济角度来看。建议提供给 保护他们免受攻击的直接代价,但是负担 他们以努力的形式带来更大的间接成本。
答案 1 :(得分:3)
当我输入密码时,我通常喜欢写更长的句子而不是p“%& / k1等。
因此,请确保您的用户可以写入超过10个符号的密码。当我被迫输入一个带有特殊字符的短密码而不是一个更难忘,更安全的长密码时,它总是令我感到沮丧。
答案 2 :(得分:2)
为什么要限制密码中的字符?无论如何你应该做某种散列。我的密码经常包含特殊符号,包括键盘中未包含的符号。
如果你想要限制,他们应该只要求它们更复杂,而不是 less 。
答案 3 :(得分:2)
我唯一不允许/删除密码的是空白,没有理由将其他任何内容包围起来。
答案 4 :(得分:0)
我只禁止无法在标准键盘上输入的字符。用户无法选择包含26个大写和小写字母,10个数字和20个符号的安全密码。
如果您正在为公共站点执行登录系统,而不是强制用户选择安全密码,我建议您使用OpenID。这样,用户无需为您的网站记住新的难以记住的密码。
答案 5 :(得分:0)
不要弄乱用户的密码。
确保在密码处理的所有阶段使用一致的编码和规则。在您的情况下,编码不应该是存储盐的问题。
作为示例,我有愚蠢的规则,如密码限制为4位数(!!!),只有字母字符(az),一些学术网站在注册时默默地将密码截断为10个字符,然后当你失败时尝试使用长密码登录。
答案 6 :(得分:-1)
我在做一些研究时偶然发现了这个问题,我认为我必须做出贡献。
实际上,我认为密码应不接受任何字符。问题可能出在与标准ASCII表不相符的字符上。
以字母ü
为例(带有变音符号的小写字母u):
ü
中有代码点U + 00FC,因此可以表示为0xC3BC ¨
)加上u
组成:结果是另一个不同的字节序列。在上述所有情况下,密码的哈希值都不同,登录将失败。
仍然允许任何Unicode字符的可能解决方案是确保整个页面在任何地方都使用UTF-8,并在对它们进行散列之前对密码进行规范化(例如使用NFC模式)。
但是,此时可能更容易禁止任何不属于标准ASCII表的字符:bytes 0x00-0x7F
或(甚至更好,剥离控制字符和其他不可表示的字符加上换行符){{ 1}}。