“ if”检查登录名是否存在于数据库中(如果存在登录名,它将让我登录,如果不存在-则不允许我进入)。但是我看到password_verify()不能正常工作,因为当我输入任何密码(如果登录正确)时,它会让我进入。我找不到我的代码错误(在password_hash和password_verify中)。
<?php
session_start();
include '../db.php'
$login = strip_tags($_POST['login']);
$password = strip_tags($_POST['password']);
try {
$stmt = $dbh->prepare("SELECT login, password FROM users");
$stmt->execute();
while ( $row = $stmt->fetch() ) {
$login_in_data = $row['login'];
$password_in_data = $row['password'];
$name_in_data = $row['name'];
}
}
catch (exeption $e) {
echo $e->getMessage();
}
if ( isset($login) && isset($password) ) {
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("SELECT * FROM users WHERE (`login`, `password`) = (:login, :hashed_password)");
$stmt->bindParam(':login', $login);
$stmt->bindParam(':hashed_password', $hashed_password);
$row = $stmt->fetch();
$stmt->execute();
}
if ($_POST['login'] == $login_in_data ) {
if ( (password_verify($_POST['password'], $hashed_password)) ) {
echo "Здравствуйте, " . $login . " !"; ?> <br> <?php
?> <a href="../personalAccount.php">Личный кабинет</a> <br>
<a href="../index.php">Главная страница</a> <?
$_SESSION['authorized'] = 1;
$_SESSION['login'] = $login;
$_SESSION['password'] = $password;
if( isset($_POST["rememberMe"]) ) {
setcookie('login', $login, time() + 60*60*24*30*60, "/");
setcookie('password', $password, time() + 60*60*24*30*60, "/");
}
if ($_SESSION['authorized'] == 1 ) {
echo " ";
echo "Session started!";
}
}
} else {
echo "Login or password is wrong!";
$_SESSION['authorized'] = 0;
}
?>
答案 0 :(得分:2)
您将$ _POST ['password']与$ password的哈希值进行比较,该值设置为$ _POST ['password'],因此很明显它将始终返回true。
除此之外,您那里还有奇怪的代码:
try {
$stmt = $dbh->prepare("SELECT login, password FROM users");
$stmt->execute();
while ( $row = $stmt->fetch() ) {
$login_in_data = $row['login'];
$password_in_data = $row['password'];
$name_in_data = $row['name'];
}
}
catch (exeption $e) {
echo $e->getMessage();
}
此代码遍历所有用户表,仅保存数据的最后一行。不知道为什么会需要这个。
if ( isset($login) && isset($password) ) {
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("SELECT * FROM users WHERE (`login`, `password`) = (:login, :hashed_password)");
$stmt->bindParam(':login', $login);
$stmt->bindParam(':hashed_password', $hashed_password);
$row = $stmt->fetch();
$stmt->execute();
}
此代码对密码进行哈希处理,然后在数据库中查询匹配的用户名和哈希值,但是password_hash()每次调用时都会输出不同的哈希值(请参见PHP documentation)。另外,您没有使用要获取的$row
。
最后,在会话和cookie中都存储密码不是一个好主意。
进行用户身份验证的简单方法是:
SELECT * from
users WHERE login = :login
)相匹配的用户password_verify($_POST[$password], $row->password)
)