正则表达式不会很好地检查密码

时间:2013-11-30 18:40:08

标签: php submission

我需要检查密码是否只包含英文数字和字母。我使用以下正则表达式:

if (!preg_match("^[A-Za-z0-9 _]*$^", $_POST['password']))
{
// show error
}
{

但这不起作用,并允许其他语言字符而不停止提交。有什么问题?

4 个答案:

答案 0 :(得分:2)

删除^末尾的preg_match^表示(如果找到第一个字符)开头,如果它是结尾,则表示字符^应该存在,但因为$出现在它之前,意思是混乱,可能意味着一些事情,最“可能”的意思是结束角色^

使用regexpal.com测试您的正则表达式。

实际上我会改为:

if (preg_match("[^A-Za-z0-9 _]", $_POST['password']))
{
  // invalid character
}

答案 1 :(得分:2)

没有“ENGLISH”号码或字母。使用与英语相同的字母表(或可以)编写许多语言。它通常被称为拉丁字母。

如果您真的只想接受拉丁字母数字字符,请使用:

if preg_match("/^[a-zA-Z0-9]+$/", $_POST['password']) {
  //good to go
} else {
  //I don't like this password
}

您的原始正则表达式有一个额外的尾随^,它允许空格和下划线。你想要允许这些角色吗?如果是,请使用^[\w ]+$

但是,如果您这样做是为了限制密码可以包含的字符,您是否停下来思考您正在做什么?限制您接受密码的字符集会大大降低其强度。您应该允许最宽范围的字符允许用户选择强密码。

如果您要检查弱密码,请忽略。但是,您应该考虑其他因素,如长度和字典单词的存在。有关详细信息,请参阅this answer

在相关说明中,您是否以散列形式存储用户的密码?这是绝对必要的。

答案 2 :(得分:0)

尝试

preg_match('/^[\w]+$/', $_POST['password'] ) instead ! 

替代方案:

preg_match("/^[a-zA-Z0-9]+$/", $_POST['password'])

答案 3 :(得分:0)

preg_match()等使用第一个字符中的分隔符设置。这将结束正则表达式,之后字符串必须结束或仅指定修饰符。

因此,您的代码应该是例如。

if (!preg_match('`^[A-Za-z0-9 _]+$`', $_POST['password']))
{
// show error
}
{

你使用^作为分隔符,但是应该使用它来使你的正则表达式从字符串start开始匹配,因此我使用反引号`因为它很少在字符串中使用(其他人会使用{{1} })。

此外,使用单引号,因为双引号/允许美元变量引用,但您希望"表示要匹配的密码的结尾。

还有一件事:匹配$也会允许你不应该鼓励的空密码,因此[...]*(尽管如果你宁愿拥有至少 n的密码,这是值得商榷的字符,即使用+进行匹配。