preg_replace密码过滤器

时间:2009-06-28 13:23:32

标签: php regex filter passwords preg-replace

使用PHP,我想对密码使用preg_replace()过滤器,以便密码可用的唯一字符是US ASCII typable,减去控制代码和NULL。

RegEx实现了什么,我可以插入preg_replace()?

修改

我被建议编辑这个问题,因为我现在“得到它”并且不会做这种非常不受欢迎的技术,并且允许任何可打字的字符,即使是我可能没有在键盘上的字符,只要他们不是控制代码。

6 个答案:

答案 0 :(得分:18)

正如其他人所说,不要限制密码中允许的字符集。仅仅因为你的键盘上没有ä,å或ö就没有理由阻止我们这些使用这些字母的人(或无论如何键入它们)。您无论如何都要将密码存储为加密哈希(或者至少作为加密字符串),不是吗?如果是这样,那么数据库是否可以成功/安全地将实际字符存储在密码中无关紧要,只考虑加密算法输出的字符。 (如果没有,那么以明文形式存储密码是一个更大的问题,而不是密码可能包含或不包含的字符 - 请勿这样做!)

通过静默剥离您不喜欢的角色而不是告诉用户“再次尝试,这次只使用这些字符:a,e,i,o,u”,明显意图强制执行字符集限制。使你提出的方法真的很残忍,因为这意味着如果我试图使用密码fäîry(不是非常安全,但应该阻止轻量级字典攻击),我的实际密码,我不知道,将是fry(如果你的密码是一个三个字母的单词,直接在字典中并且在常用中,你甚至可能都不会打扰)。哎哟!

答案 1 :(得分:10)

就个人而言,当网站或服务试图强迫我使用遵循某种(通常是彻头彻尾的愚蠢)限制的密码时,我总是觉得非常令人不安。

这不是密码的全部意义,它们不容易猜到吗?为什么你希望它们不像用户想要的那么复杂?我无法想象一个技术限制,需要使用“仅ASCII”密码。

让您的用户使用他们喜欢的任何密码,哈希并将其存储为Base64字符串。这些只是ASCII。

答案 2 :(得分:4)

你走了:

^[ -~]+$

假设您不想要空密码;否则就是:

^[ -~]*$

允许空的。

我不确定你为什么询问preg_replace - 我对操纵人们输入的密码持谨慎态度。最好强制执行您只接受可打印ASCII的规则,并告诉用户他们是否违反了该规则(或者,正如其他人所说,没有任何规则,但我认为你有理由)。

如果您正在考虑安静地删除不匹配的字符,并且有人附带了Úéæ的密码,那么您将在他们不知情的情况下为他们存储空密码。

答案 3 :(得分:1)

请不要过滤您的用户密码。这击败了很多重点。我在这里写了更多关于此的内容:http://www.evanfosmark.com/2009/06/why-do-so-many-websites-fail-with-password-restrictions/

答案 4 :(得分:1)

我不同意没有理由拒绝非ascii字符,尽管由你来决定优点是否超过缺点。

如果您允许使用非ascii字符,那么您实际上正在承诺将Web部分应用程序的这一部分正确地国际化。对于许多应用来说,国际化是事后的想法。对于Web应用程序来说,这是一件非常重要的事情。

如果在字符和字节之间没有明确控制字符编码,那么您基本上依赖于部署的默认值。如果您的配置发生了变化(例如从Windows迁移到Linux,或者切换到另一个Web服务器),那么您的默认设置很可能会从您的下方进行更改,然后非ascii字符将序列化为不同的字节序列。因此,突然之间,在密码中使用它们的人的哈希值将与数据库中的内容不匹配,并且它们将被锁定在他们的帐户之外。

当然,我确实同意过滤掉那些角色是完全不可接受的;你必须接受或拒绝密码。

答案 5 :(得分:0)

/ [\ p {Cc}] /获取控制字符(我认为这涵盖0-31)

我同意里奇的观点。使用preg_match而不是preg_replace。