3/4密码要求

时间:2013-07-29 13:19:43

标签: php database passwords

我正在尝试让我的网站要求用户(当他们创建帐户时)包含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语句并收到警报消息。关于什么是错的或者有更简单的方法来做任何想法?

1 个答案:

答案 0 :(得分:5)

你的问题在这里:

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

您正尝试在单引号中访问变量 $ passwordspecs 的值。您需要使用双引号。否则将其视为字符串。将其更改为:

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

但是你有更多的问题:

  1. 不要将密码存储为字符串,请使用某种哈希算法 Garytje 建议。
  2. 不要将数据直接插入用户提供的数据库中。 (不要信任用户输入),换句话说,使用预准备语句,否则有人会注入SQL代码。
  3. 在我看来,作为一个客户/用户,我讨厌当我必须选择这样的密码时,以后很难记住。我正在您的网站上注册(意味着您获得+1用户)为什么我无法选择密码而不管我想要的“黑客”?为什么我必须遵守你的规则。也许我希望我的密码是一个空的空间?

    并且告诉用户他们必须以这种格式输入密码,它会向可能的“黑客”发出敏感信息,因为这样他们就可以缩小所有可能的密码以匹配您的格式和攻击蛮力