PHP密码\u验证始终返回false
我一直在开发一个Android应用程序,它可以注册用户并登录到远程MySQL数据库。我已经仔细检查了我的Android代码和从应用程序发送到PHP的信息 显然,问题出在login.php文件的某个地方。用户注册成功,但之后我无法登录 My DB有3个字段:PHP密码\u验证始终返回false,php,mysql,passwords,Php,Mysql,Passwords,我一直在开发一个Android应用程序,它可以注册用户并登录到远程MySQL数据库。我已经仔细检查了我的Android代码和从应用程序发送到PHP的信息 显然,问题出在login.php文件的某个地方。用户注册成功,但之后我无法登录 My DB有3个字段: id/int(11) 电子邮件/varchar(255) 密码/字符(60) 注册一个用户会给我密码字段60个字符的哈希值。到目前为止,一切顺利。但当我尝试登录时,总是会收到失败响应 我使用的是PHP5.4,因为我仅限于PHP5.4 以下
- id/int(11)
- 电子邮件/varchar(255)
- 密码/字符(60)
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$email = $_POST['email'];
$passwordFromPost = $_POST['password'];
require_once('dbconnect.php');
$sql = "SELECT password FROM users WHERE email = '$email'";
$hash = mysqli_query($con, $sql);
require_once('lib/password.php');
if (password_verify($passwordFromPost, $hash)) {
echo 'success';
} else {
echo 'failure';
}
}
?>
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$email = $_POST['email'];
$passwordFromPost = $_POST['password'];
require_once('lib/password.php');
$hash = password_hash($passwordFromPost, PASSWORD_BCRYPT);
if($hash) {
require_once('dbconnect.php');
$sql = "INSERT INTO users (email, password) VALUES ('$email','$hash')";
if(mysqli_query($con, $sql)){
echo "Registered succesfully";
} else {
echo "Unable to register the account";
}
} else {
echo 'error';
}
} else {
echo 'error';
}
?>
您的登录php文件应该是
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$email = $_POST['email'];
$passwordFromPost = $_POST['password'];
require_once('dbconnect.php');
$sql = "SELECT password FROM users WHERE email = '$email'";
$rst = mysqli_query($con, $sql);
$hash = mysqli_fetch_row($rst);
require_once('lib/password.php');
if (password_verify($passwordFromPost, $hash['password'])) {
echo 'success';
} else {
echo 'failure';
}
}
?>
您忘记取行了。因此,您没有根据字符串进行验证
<?php
$result = mysqli_query($con, $sql);
$row = mysqli_fetch_array($result);
password_verify($passwordFromPost, $row['password']);
您需要获取行:
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$email = $_POST['email'];
$passwordFromPost = $_POST['password'];
require_once('dbconnect.php');
$sql = "SELECT password FROM users WHERE email = '$email'";
$hash = mysqli_query($con, $sql);
while ($row = mysqli_fetch_row($hash)) {
require_once('lib/password.php');
if (password_verify($passwordFromPost, $row["password"])) {
echo 'success';
} else {
echo 'failure';
}
}
}
?>
lib/password.php中有什么内容?注册用户时,您是否确定加密的密码不超过60个字符,并将其截断?mysqli_query()
返回包含密码列的行的结果集(在本例中,希望只有1行)。。。。。您需要获取行并获取password列来执行此操作verify@HuzaibShafi这说明您在这里检查的变量是错误的if(password\u verify($passwordFromPost,$hash)){
并且必须查询密码行。那没有任何意义,因为据我所知,密码\u散列
算法每次都会生成不同的散列。@sergio martell no.。所有好的散列算法都会为同一个字符串生成相同的散列不……如果OP要根据存储在使用密码的数据库\u验证(),则他们不应从中散列密码input@HuzaibShafi我已经尝试过你的代码方案。它不起作用。另外,我正在尝试用相同的密码注册不同的帐户,并且存储的哈希值总是不同的。@马克·贝克表示歉意。。我没有查看验证函数的代码。非常感谢!这实际上解决了问题莱姆!如果这是一个解释,那就太好了。注意了。“塞尔莫马特尔如果它解决了你的问题,考虑接受答案。这里是如何返回这里,并用滴答/检查标记做同样的事情,直到变成绿色。这通知了社区,找到了解决方案。否则,其他人可能会想到。问题仍然悬而未决,可能需要发布(更多)答案。现在已检查。再次感谢@Fred ii-同时,感谢您提供的解释。