PHP,我想用一个preg_replace()过滤器,用于密码,使得不仅可用的字符的密码都是我们ASCII是可键入是的,减去控制代码和空。

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

编辑:

我已经建议为编辑这个问题,因为我"得到它"现在不会这样做非常不受欢迎的技术,并将允许任何是可键入是符甚至那些我可能不具有对我的键盘只要他们不是控制代码。

有帮助吗?

解决方案

正如其他人所说的那样,不限制所设置的字符,允许在的密码。只是因为 你的 键盘没有ä,埃,或是的...它是没有理由停止我们这些谁做的他们有(或不知道如何类型他们无论如何),从用这些信件。你会保存密码加密散列无论如何(或至少作为一个加密的string),不是吗?如果是这样,那么不管你的数据库可以成功地/安全地储存的实际个字符的密码无论如何,只字输出你的密码算法。(如果不是,则保存密码明文是 更大的问题比什么样的字符的密码可能或可能不包含-不要!)

你的明显意图,以执行你的角色设定的限制,通过悄悄地剥字你不喜欢而不是通过告诉用户"再试一次,这个时候,只使用这些角色是:a、e,i,o,u."使你的拟议方法的真正残暴,因为它意味着,如果我尝试使用的密码 fäîry (不令人难以置信的安全,但应该保持对轻型词典的攻击),我实际的密码,我不知道,会 fry (如果你的密码是一个三个字母的词,直出的词典,并在共同使用,您可能会以及甚至没打扰).哎哟!

其他提示

就个人而言,我一直认为这非常令人不安,当一个网站或服务试图强迫我用的是按照一定的(通常是彻头彻尾的愚蠢的)限制的密码。

是不是密码,他们是不是太容易被猜到的整点?你为什么会想他们是不是你的用户希望他们那么复杂?我无法想象,就需要使用“ASCII仅”为密码的技术限制。

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

在这里你去:

^[ -~]+$

假设你不想使用空密码;否则它是:

^[ -~]*$

,以允许空的。

我不知道你为什么问preg_replace - 我会警惕操纵人们键入密码。更好地执行你只接受打印的ASCII,并且告诉用户,如果他们打破规则的规则(或者,如其他人所说,没有任何的规则,但我相信你对他们的原因)。

如果你想静静地消除不匹配的字符,有人用Úéåæ的密码走来,那么你就可以存储他们的空密码不知情的情况下。

请不要过滤您的用户密码。这违背了一大堆的点。我写了更多关于这个在这里:的 http://www.evanfosmark.com/2009/06/why-do-so-many-websites-fail-with-password-restrictions/

我不同意,没有理由拒绝非ASCII字符,但它是由你来决定的利弊是否利大于弊。

如果您允许非ASCII字符,那么你实际上犯正常国际化Web应用程序的部分。对于许多应用,国际化是一个事后的想法。对于Web应用程序,这是一个非常不平凡的事。

如果你不明确控制字符编码,当你的字符和字节之间去的话,你基本上依赖于任何默认恰巧是您的部署。如果您的配置都没有改变(例如从Windows迁移到Linux,或切换到另一台Web服务器),那么你的默认有从下你改变一个很好的机会,然后将非ASCII字符将序列化到一个不同的字节序列。于是,突然,在他们的密码中使用它们的人的哈希值不匹配什么在数据库中,他们将被锁定在帐户外。

我,当然,同意,它是完全不能接受的只是筛选出那些字符;你必须接受或拒绝的密码。

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

我同意里奇。使用的preg_match代替的preg_replace。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top