Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_更换密码过滤器_Php_Regex_Filter_Passwords_Preg Replace - Fatal编程技术网

Php preg_更换密码过滤器

Php preg_更换密码过滤器,php,regex,filter,passwords,preg-replace,Php,Regex,Filter,Passwords,Preg Replace,在PHP中,我希望对密码使用preg_replace()过滤器,这样密码中唯一可用的字符就是US ASCII可键入字符,减去控制代码和NULL 我可以用什么正则表达式来实现preg_replace()插件 编辑: 自从我现在“明白”了,我就被建议编辑这个问题,我不会使用这种非常不受欢迎的技术,并且允许任何可键入的字符,即使是我键盘上可能没有的字符,只要它们不是控制代码。给你: ^[ -~]+$ 假设你不想要空密码;否则就是: ^[ -~]*$ 允许空的 我不知道你为什么要问preg\u re

在PHP中,我希望对密码使用preg_replace()过滤器,这样密码中唯一可用的字符就是US ASCII可键入字符,减去控制代码和NULL

我可以用什么正则表达式来实现preg_replace()插件

编辑:

自从我现在“明白”了,我就被建议编辑这个问题,我不会使用这种非常不受欢迎的技术,并且允许任何可键入的字符,即使是我键盘上可能没有的字符,只要它们不是控制代码。

给你:

^[ -~]+$
假设你不想要空密码;否则就是:

^[ -~]*$
允许空的

我不知道你为什么要问
preg\u replace
-我会小心操纵人们键入的密码。最好强制执行只接受可打印ASCII的规则,并告诉用户他们是否违反了该规则(或者,正如其他人所说,没有任何规则,但我认为您有理由这样做)


如果你想悄悄地删除不匹配的字符,而有人提供了一个Úåæ的密码,那么你将在他们不知情的情况下为他们存储一个空密码。

就我个人而言,当一个网站或服务试图强迫我使用遵循特定密码时,我总是感到非常不安(通常是彻头彻尾的愚蠢)限制

密码不太容易猜到,这不是密码的全部意义吗?为什么您希望它们比您的用户希望的要简单?我无法想象一个技术限制要求对密码使用“仅ASCII”


允许您的用户使用他们喜欢的任何密码,将其散列并存储为Base64字符串。这些仅为ASCII。

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


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

请不要过滤你的用户密码。这一点完全不符合要点。我在这里写了更多关于这一点的内容:

正如其他人所说,不要限制密码中允许的字符集。仅仅因为你的键盘上没有ä、å或ö是没有理由的阻止我们这些拥有密码(或者知道如何键入)的人使用这些字母。您将以加密哈希(或者至少以加密字符串)的形式存储密码,不是吗?如果是这样,那么数据库是否能够成功/安全地将实际字符存储在密码中并不重要,只会存储加密算法输出的字符。(如果不是,则以明文存储密码的问题要比密码可能包含或不包含的字符大得多-不要这样做!)


你显然有意通过无声地剥离你不喜欢的字符来强制你的字符集限制,而不是告诉用户“再试一次,这次只使用这些字符:a、e、i、o、u”。这使得你提出的方法真的很糟糕,因为这意味着如果我试图使用密码
fäîry
(安全性不高,但应能抵御轻量级字典攻击),我不知道的实际密码将是
fry
(如果您的密码是三个字母的单词,直接从字典中取出来,并且是常用的,您甚至可以不必麻烦).Ouch!

我不同意没有理由拒绝非ascii字符,尽管是否利大于弊由您决定

如果您允许使用非ascii字符,那么实际上您正在承诺对web应用程序的该部分进行适当的国际化。对于许多应用程序来说,国际化是事后考虑的。对于web应用程序来说,这是一件非常重要的事

如果在字符和字节之间切换时没有显式控制字符编码,则基本上依赖于部署时的默认设置。如果配置发生更改(例如从Windows迁移到Linux,或切换到其他web服务器),则您的默认值很有可能从您的下方更改,然后非ascii字符将序列化为不同的字节序列。因此,突然之间,在密码中使用这些字符的人的哈希值将与数据库中的哈希值不匹配,他们将被锁定在帐户之外


当然,我同意仅仅过滤掉这些字符是完全不可接受的;您必须接受或拒绝密码。

好吧……我们可以输入ASCII码。他试图过滤的字符可能无效,但这确实让我想问……为什么您甚至需要过滤用户不可能输入的字符HTML表单应该是一个针对控制字符的自然缓冲区。嘿,Dave。我想感谢你让我明白这一点,并说“我明白了”.问题是,在这个疯狂的系统中,我写的这篇糟糕的帖子就像是我声誉的锚。我不能删除它,也不能提高我的声誉。我已经向stackoverflow.com的开发者提出了投诉。人们真的会犯错误——我们不应该永远忍受这些错误。有了stackoverflow,你最终会因为r永恒,除非他们修复此问题。很乐意提供帮助!而且,如果我正确理解此处的代表系统,您的代表将不再受此问题的影响,因为它已标记为“community wiki”。“或者至少标记为加密字符串”——nope@GoodPerson:存储加密字符串而不是散列有一些有效的用例,例如“密码保险箱”,因为应用程序的预期功能特别要求存储的密码是可恢复的。它们非常非常罕见,但它们确实存在。@DaveSherohman:是的。我还希望编写这种工具的人都是这类系统的专家:)