Preg_match在不应该触发时触发

时间:2013-08-03 07:23:44

标签: php

好的,我正在使用以下代码(其中$password =后置密码变量)。这是大型表单验证代码的一部分,这行代码似乎在它不应该触发时触发。我担心它的某些部分已被弃用。我尝试输入pass123APassword121Password,它们都会触发此代码。为什么呢?

elseif(preg_match("/^[a-zA-Z0-9]$/", $password) == 0)
echo('Error - the password can only contain alpha-numeric chars!');

2 个答案:

答案 0 :(得分:3)

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

...只匹配单个字符密码。

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

......应该会更好。

也许我应该注意,这也会匹配密码,但我假设你单独检查长度。

编辑:如果由于SQL不安全而限制密码,您应该切换到PDO或MySQLi并使用参数化查询,这将允许您存储任何字符串而无需特殊处理特殊字符(如{{1} }),这将使您的网站上的SQL更安全。

此外,如果你以明文形式存储密码,你应该考虑散列它们:)

答案 1 :(得分:0)

您可以这样使用:+$

if (...)
   // do anything
elseif(!preg_match("/^[a-zA-Z0-9]+$/", $password))
   echo('Error - the password can only contain alpha-numeric chars!');

使用+$代替*$

*允许空字符串。如果$password发送为空,则不匹配。