我们如何检查数据库中是否不存在密码?

时间:2020-11-06 17:04:10

标签: php mysql authentication passwords

我按照MVC设计模式在PHP 7和MySQL 5中开发了一个Web应用程序。我正在注册系统上,在那里我遇到了password_verify方法的问题。确实,我将在插入用户个人资料之前检查数据库中是否不存在密码。这是我的代码:

 public function signUp($name, $firstname, $profilePicture, $phone, $email, $password, $passwordConfirmation)
    {
        $userData = $this->_userDAO->getUsersDataByEmail($email);
        if (isset($name) && isset($firstname)
            && isset($profilePicture)
            && isset($phone) && isset($email)
            && isset($password) && isset($passwordConfirmation)) {
            if ($userData == false) {
                if (password_verify($password, $userData["password"]) == false) {
                    if (preg_match("/^0[1-9]([0-9]{2}){4}$/", $phone)) {
                        if (preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@\/+=!?&*#<>_]).{8,}$/", $password)) {
                            if ($password == $passwordConfirmation) {
                                $this->_userDAO->addUser($name, $firstname, $profilePicture, $phone, $email, password_hash($password, PASSWORD_DEFAULT));
                                $this->_membersDAO->addMember();
                                header("Location:index.php");
                            } else {
                                echo "Les mots de passe ne se correspondent pas, veuillez réssayer s'il vous plaît !";
                            }
                        } else {
                            echo "Votre mot de passe doit contenir au moins un chiffre, une lettre minuscule, une majuscule ainsi qu'un 
                     symbole spéciale et être d'une longueur supérieure à 8 caractères !";
                        }
                    } else {
                        echo "Veuillez saisir un numéro de téléphone valide !";
                    }
                    } else {
                    echo "Le mot de passe saisie est déjà utilisé ! Veuillez en choisir un autre !";
                }


            } else {
                echo "L'email saisie est déjà utilisé, veuillez en saisir un autre !";
            }

        }
    }

   public function getUsersByEmail($email)
    {
        $sql = "SELECT * FROM `users` WHERE email = ?";
        $userEmail = $this->queryRow($sql, $email);

        return $userEmail;
    }

public function addUser($name, $firstname, $profilePicture, $phone, $email, $password)
{
    $column = ["name", "firstname", "profile_picture", "phone", "email", "password"];
    $values = ["'$name'", "'$firstname'", "'$profilePicture'", "'$phone'", "'$email'", "'$password'"];
    $this->insertRow("users", $column, $values);
}

public function queryRow($sql, $param = null) { 
try { 
$request = $this->request($sql, $param); 
$data = $request->fetch(PDO::FETCH_ASSOC); 
$request->closeCursor(); } 
catch (PDOException $e) { 
die("Erreur : " . $e->getMessage()); } 
return $data; 
} 

但是,当我执行脚本时,用户的数据被注册,而用户输入的密码已经存在于数据库中。

能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

使用php的密码哈希系统时,不能使用SQL来确定密码是否唯一。为什么不?哈希系统会对每个密码应用随机的。从根本上讲,这种盐的目的是在不对数据库中的每个密码使用password_verify()的情况下,无法将一个密码与另一个密码进行比较。 php和密码哈希的工作方式是:每个密码大约需要250毫秒。那是一个令人费解的时间。这就是重点:哈希和验证密码是故意要占用大量CPU的进程,以降低网络蠕虫病毒的速度。

通常,每个用户都应该能够选择自己的密码。如果您告诉用户系统中已经存在一个特定的密码,则表示存在安全漏洞。

我从来没有听说过强制密码唯一性的系统(而且我听说过许多系统)。您确实需要实施用户名唯一性,无论是通过使用电子邮件地址作为用户名,还是拒绝现有的用户名。

创建新用户时,只需在该密码上使用password_hash()即可获取要放入数据库中该用户行的值。