-1

我试图让我的网站要求用户(当他们创建帐户时)包含 3/4 密码要求。我希望密码包含的要求是:1. 数字 2. 小写字母 3. 大写字母 4. 特殊符号/字符。这是我到目前为止的代码:

    $passwordspecs='^(?=.{8, 20})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$ | ^(?=.{8, 20})(?=.*[a-z])(?=.*[A-Z])(?=.*[@$#£&]).*$ | ^(?=.{8, 20})(?=.*\d)(?=.*[a-z])(?=.*[@$#£&]).*$ | ^(?=.{8, 20})(?=.*\d)(?=.*[A-Z])(?=.*[@$#^£&]).*$';
    if(preg_match('/$passwordspecs/', $_POST['password'])) {
        $results="INSERT INTO Operator (Username, Password, PermissionLevel)
        VALUES ('$_POST[username]', '$_POST[password]', '$_POST[plevel]')";
        echo "One user added!";
    }
    else {
        echo '<script type="text/javascript">';
        echo 'alert("Password needs to contain 3/4 requirements!")';
        echo '</script>';
    }

我终于能够摆脱出现的错误消息,但现在无论我输入 3/4 还是 4/4 密码要求,它都会直接进入 else 语句,我会收到警报消息。关于出了什么问题的任何想法,或者可能有更简单的方法来做到这一点?

4

1 回答 1

5

你的问题在这里:

preg_match('/$passwordspecs/', $_POST['password'])

您试图在单引号中访问变量$passwordspecs的值。您需要改用双引号。否则,它被视为一个字符串。将其更改为:

preg_match("/{$passwordspecs}/", $_POST['password'])

但是你有更多的问题:

  1. 不要将密码存储为字符串,使用Garytje建议的某种散列算法。
  2. 不要直接将数据插入到用户提供的数据库中。(不要信任用户输入),换句话说,使用准备好的语句,否则有人会注入 SQL 代码。

在我看来,作为客户/用户,我讨厌必须选择这样的密码,以后很难记住。我正在您的网站上注册(意味着您获得 +1 位用户)为什么我不能选择密码,无论我希望它是什么“黑客”?为什么我必须遵守你的规则。也许我希望我的密码是一个空白空间?

而且通过告诉用户他们必须以这种格式输入密码,它会向可能的“黑客”提供敏感信息,因为他们可以缩小所有可能的密码以匹配您的格式并使用暴力攻击。

于 2013-07-29T13:25:41.077 回答