当我能够使用MD5哈希用户密码时,我正在构建一个应用程序。对于插入,它可以正常工作,但是当我进行身份验证时,它告诉我密码错误
require_once('connect.php');
$data = json_decode(file_get_contents("php://input"));
$email = ($data->email);
$password = ($data->password);
$row = $conn->query("
SELECT *
FROM user
WHERE email='".$email."'
AND password='".md5.$password."'
");
$row->setFetchMode(PDO::FETCH_ASSOC);
$userdetails = $row->fetchAll();
$user = $row->rowCount();
$error_message=array("message"=>("wrong"));
if ($user == 0) {
echo json_encode($error_message);
} else {
session_start();
$_SESSION['user']=$userdetails;
echo json_encode($userdetails);
}
答案 0 :(得分:4)
更改
$row = $conn->query("SELECT * from user where email='".$email."' and password='".md5.$password."'");
到
$row = $conn->query("SELECT * from user where email='".$email."' and password='".md5($password)."'");
注意:您应该使用准备好的语句,也不要使用md5()
和password_hash()
和password_verify()
然后将在您的注册页面中。
$hash = password_hash($password,password_default); // store this hash
然后进入您的登录页面。
$stmt = $conn->query("SELECT * from user where email= ? ");
$stmt->execute(array($email));
$row = $stmt->fetch();
if(password_verify($password,$row['passwordFromDB'])){
session_start();
$_SESSION['user']=$userdetails;
//return what needs to be returned
}else{
$error_message=array("message"=>("wrong"));
echo json_encode($error_message);
}
注意:确保您的数据库列的长度为60 +
答案 1 :(得分:1)
由于多种原因,您的代码不安全:
在您的pdo实例中使用准备好的语句。
代替使用pdo的查询功能,而使用prepare PDO::prepare,这将使SQL注入风险更加平坦(尽管仍然可能)。
请勿将md5用作哈希算法
MD5不再安全,请使用PHP提供的标准password_hash / password_verify函数。 password_hash()
顺便说一句,您的错误出在查询中
$row = $conn->query("SELECT * from user where email='".$email."'
and password='".md5.$password."'");
它是md5($ password)而不是md5。$ password
答案 2 :(得分:0)
我想你的意思是
$conn->query("SELECT * from user where email='".$email."' and password='".md5($password)."'");
键入md5.$password
可能会评估为字符串md5
,后跟输入的密码。根据您的PHP设置,它也可能会发出警告。