我按照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;
}
但是,当我执行脚本时,用户的数据被注册,而用户输入的密码已经存在于数据库中。
能帮我解决这个问题吗?
答案 0 :(得分:2)
使用php的密码哈希系统时,不能使用SQL来确定密码是否唯一。为什么不?哈希系统会对每个密码应用随机的盐。从根本上讲,这种盐的目的是在不对数据库中的每个密码使用password_verify()的情况下,无法将一个密码与另一个密码进行比较。 php和密码哈希的工作方式是:每个密码大约需要250毫秒。那是一个令人费解的时间。这就是重点:哈希和验证密码是故意要占用大量CPU的进程,以降低网络蠕虫病毒的速度。
通常,每个用户都应该能够选择自己的密码。如果您告诉用户系统中已经存在一个特定的密码,则表示存在安全漏洞。
我从来没有听说过强制密码唯一性的系统(而且我听说过许多系统)。您确实需要实施用户名唯一性,无论是通过使用电子邮件地址作为用户名,还是拒绝现有的用户名。
创建新用户时,只需在该密码上使用password_hash()即可获取要放入数据库中该用户行的值。