PHP/MySQL/PDO-登录表单无法识别现有用户
我的登录表单无法识别现有用户。我存储在数据库中的密码是使用PHP的crypt()函数加密的。当用户注册时,他们的密码也被加密并插入数据库 正如您在下面的代码中所看到的,它会检查下面输入的密码是否匹配,但每当我输入一个存储在数据库中的密码并使用相应的用户名时,它就会说该用户不存在 我是PDO新手,这是我第一次使用它,通常如果我只使用MySQL,它就可以正常工作,但由于某些原因,它不能正常工作,我对代码做了一些更改,但它仍然不能正常工作。任何人都知道我为什么/在哪里/在代码上做错了什么PHP/MySQL/PDO-登录表单无法识别现有用户,php,mysql,pdo,passwords,encryption,Php,Mysql,Pdo,Passwords,Encryption,我的登录表单无法识别现有用户。我存储在数据库中的密码是使用PHP的crypt()函数加密的。当用户注册时,他们的密码也被加密并插入数据库 正如您在下面的代码中所看到的,它会检查下面输入的密码是否匹配,但每当我输入一个存储在数据库中的密码并使用相应的用户名时,它就会说该用户不存在 我是PDO新手,这是我第一次使用它,通常如果我只使用MySQL,它就可以正常工作,但由于某些原因,它不能正常工作,我对代码做了一些更改,但它仍然不能正常工作。任何人都知道我为什么/在哪里/在代码上做错了什么 includ
include "connect.php";
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username=:username";
$statement = $db->prepare($sql);
$statement->bindValue(':username',$username,PDO::PARAM_STR);
if($statement->execute())
{
if($statement->rowCount() == 1)
{
$row = $statement->fetch(PDO::FETCH_ASSOC);
if(crypt($password, $row['username']) == $row['user_password'])
{
$username = $row['username'];
$email = $row['email'];
$_SESSION['username'] = $username;
$_SESSION['email'] = $email;
$_SESSION['logged_in'] = 1;
header("Location: index.php");
exit;
}
else
{
include "error_login.php";
}
}
else
{
include "error_login.php";
}
}
应该是
if(crypt($password) == $row['user_password'])
要使用存储的散列值验证密码,您需要知道salt以及之前用于生成散列值的算法。这个salt可以从存储的哈希值中提取,因为crypt()将其存储为结果字符串的一部分
if (crypt($password, $row['user_password']) === $row['user_password'])
PHP5.5将准备好自己的函数和密码_verify(),以简化BCrypt哈希的生成。我强烈建议使用这个优秀的api,或者它适用于早期的PHP版本。用法非常简单:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
您的两个if语句都包含
error\u login
if它们为false-您知道调用的是哪一个吗?请使用session\u start()代码>在顶部also@andrew:但只有在地下室不匹配的情况下才可以。@andythebrit:用鸟枪射击。在整个过程中添加一些debugecho
语句,这样您就可以了解所采用的代码路径。很可能代码本身很好,但数据库中的密码不是PHP生成的密码,因此密码永远不会匹配。您需要在顶部使用session\u start()
,否则将无法访问所有这些会话变量。另外,请注意,如果在同一个字符串上使用crypt()
两次而不指定“salt”字符串,它将输出两个不同的结果,因为crypt()
将自动生成salt。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);