PHP PDO登录系统故障
我正在做一个登录系统,但似乎任何拥有任何密码的用户都可以进入我的系统 我可以使用mysqli制作这个系统,但是我在PDO上遇到了问题。我该如何解决它PHP PDO登录系统故障,php,mysql,pdo,Php,Mysql,Pdo,我正在做一个登录系统,但似乎任何拥有任何密码的用户都可以进入我的系统 我可以使用mysqli制作这个系统,但是我在PDO上遇到了问题。我该如何解决它 if(isset($_POST["login-submit"])){ require "dbh.inc.php"; $username = $_POST["username"]; $user_password = $_POST["password"]; $user_password = password_hash($
if(isset($_POST["login-submit"])){
require "dbh.inc.php";
$username = $_POST["username"];
$user_password = $_POST["password"];
$user_password = password_hash($user_password, PASSWORD_DEFAULT);
$sql = "SELECT count(id) FROM users WHERE username = :username AND user_password = :user_password";
$stmt = $conn->prepare($sql);
$stmt->execute(["username" => $username, "user_password" => $user_password]);
if($stmt->rowCount() == 1){
session_start();
$_SESSION["username"] = $username;
header("location:../index.php?login=success");
exit();
} else {
header("location:../index.php?login=failed");
exit();
}
}
我已经测试了代码的所有其他部分,当我注册一个新用户时,它们似乎工作得很好,但如果我使用登录表单,任何人只要有任何密码都可以进入我的系统。它总是显示登录成功,即使我输入了一个错误的用户与wron密码。
我也看到过其他关于堆栈溢出的类似问题,但这些代码有点复杂。rowCount()
不用于SELECT语句:
PDOStatement::rowCount()返回受相应PDOStatement对象执行的最后一个DELETE、INSERT或UPDATE语句影响的行数
如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为
您需要检索和检查查询执行的实际结果,而不仅仅是检查执行时发生的情况。(假设您的数据库是从SELECT返回行数的数据库之一)
聚合sql将始终(至少)返回一行,因为
计数可以是0。假设id是唯一的主键,则无需再次对密码进行哈希运算以检查密码的有效性,而应使用password\u verify
检查密码是否合法
if(isset($_POST["login-submit"])){
require "dbh.inc.php";
$username = $_POST["username"];
$user_password = $_POST["password"];
$sql = "SELECT * FROM users WHERE username = :username";
$stmt = $conn->prepare($sql);
$stmt->execute(["username" => $username]);
$user = $stmt->fetch();
$hash = $user['user_password'];
if(password_verify($user_password,$hash)){
session_start();
$_SESSION["username"] = $username;
header("location:../index.php?login=success");
exit();
} else {
header("location:../index.php?login=failed");
exit();
}
}
假设您使用password\u hash
函数将用户密码保存在数据库中。
另外,在使用用户名获取后,获取散列,然后使用password\u verify()
function,验证它。那么会发生什么呢?你得到login=failed的标题了吗?我刚刚更新了问题,请在提出任何问题之前进行研究,因此,请看我已经看到了该页面,相信我,当我去那里阅读内容时,它看起来像中文。查看此密码\u散列(string$password,int$algo[,array$options]):string我从未见过这样的数组。我是PHP新手。请您编写实际代码并编辑上面的代码。这不是问题中的唯一问题