3/4密码要求

Lla*_*ama 0 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>';
    }
Run Code Online (Sandbox Code Playgroud)

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

GGi*_*Gio 5

你的问题在这里:

preg_match('/$passwordspecs/', $_POST['password'])
Run Code Online (Sandbox Code Playgroud)

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

preg_match("/{$passwordspecs}/", $_POST['password'])
Run Code Online (Sandbox Code Playgroud)

但是你有更多的问题:

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

在我看来,作为一个客户/用户,我讨厌当我必须选择这样的密码时,以后很难记住.我正在您的网站上注册(意味着您获得+1用户)为什么我无法选择密码而不管我想要的"黑客"?为什么我必须遵守你的规则.也许我希望我的密码是一个空的空间?

此外,通过告诉用户他们必须以这种格式输入密码,它会向可能的"黑客"发送敏感信息,因为这样他们就可以缩小所有可能的密码以匹配您的格式并使用暴力攻击.