不允许使用密码中的字符?

时间:2010-07-03 08:58:20

标签: php mysql security passwords

密码中是否允许/不允许使用某些字符?

我将密码存储在db hashed / salted中,并使用PDO来防止注入。我做得还够吗?最近我遇到了一个系统,它不允许一些角色,不记得所有角色,但其中一个是符号&。他们这样做是出于反数据库注入的原因,还是我还缺少其他东西?密码字符是否应限制在某一组字符或不需要?

7 个答案:

答案 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):

  • 在扩展ASCII中,该字符为0x81。
  • 在ISO-8859-1中(在西方国家很常见)它是0xFC。
  • 在UTF-8 ü中有代码点U + 00FC,因此可以表示为0xC3BC
  • 但在UTF-8中,角色也可能没有标准化。所以它可以由变音符号(只是¨)加上u组成:结果是另一个不同的字节序列。

在上述所有情况下,密码的哈希值都不同,登录将失败。

仍然允许任何Unicode字符的可能解决方案是确保整个页面在任何地方都使用UTF-8,并在对它们进行散列之前对密码进行规范化(例如使用NFC模式)。
但是,此时可能更容易禁止任何不属于标准ASCII表的字符:bytes 0x00-0x7F或(甚至更好,剥离控制字符和其他不可表示的字符加上换行符){{ 1}}。