我在使用此登录脚本时遇到了一些问题,我已经让其他人为我查看了,我们似乎无法弄清楚问题是什么。
当用户尝试登录时,如果用户名是正确的,它将检查密码是否正确以及密码是否正确,它会更新上次访问日期并重定向。但是,如果用户名正确且密码不正确。它应该清空密码,并让用户知道他们输入的密码是不正确的。 当密码不正确时实际发生的是,它是否跳到最外面的else语句,并清空用户名和密码并说出有问题...输入的用户名是否正确(无论是否密码是对的。)
我不知道这里发生了什么,希望有人可以帮助我阐明一下。
谢谢!
$selectUser = pg_prepare($dbConnection, "selectuser_query", 'SELECT * FROM users WHERE user_id = $1 AND password = $2');
<?php
$error = "";
$username_error = "";
$password_error = "";
if($_SERVER["REQUEST_METHOD"] == "GET")
{
$login = "";
$password = "";
}
else if($_SERVER["REQUEST_METHOD"] == "POST")
{
$login = trim($_POST["login"]);
$password = trim($_POST["password"]);
if(!isset($login) || $login == "")
{
$username_error = "You must enter your user name to login!";
}
if (!isset($password) || $password == "")
{
$password_error = "You must enter your password to login!";
}
if(($error == "") && ($password_error == "") && ($username_error == ""))
{
$selectUser = pg_execute($dbConnection, "selectuser_query", array("$login", "$password"));
if($login == pg_fetch_result($selectUser, "user_id"))
{
if($password == pg_fetch_result($selectUser, "password"))
{
$date = date("n-j-Y");
$updateDateAccess = pg_execute($dbConnection, "updatedate_query", array("'$date'", "$login"));
header('Location: ./welcome.php');
}
else
{
$password = "";
$error = "The password is incorrect. Please try again.";
}
}
else
{
$login = "";
$password = "";
$error = "The username/password is incorrect. Please try again.";
}
}
}
?>
答案 0 :(得分:3)
您的问题是您的疑问:
SELECT * FROM users WHERE user_id = $1 AND password = $2
它会检查用户名和密码,如果密码不正确,则不会返回任何记录。因此,下一个if
条件不满足:
$selectUser = pg_execute($dbConnection, "selectuser_query", array("$login", "$password")); // no records
if($login == pg_fetch_result($selectUser, "user_id")) // not satisfied, because there are no records
{
// ...
}
else // this runs
{
$login = "";
$password = "";
$error = "The username/password is incorrect. Please try again.";
}
您要做的是运行查询以检索给定用户名的(盐渍和散列)密码,然后检查应用程序逻辑中的密码。
另外,正如其他人在评论中指出的那样,这不是存储密码或回复错误信息的好方法。看起来密码是纯文本的,但是应该对它们进行散列和加密。此外,您不应告诉用户哪部分信息不正确;否则,你让攻击者确定有效的用户名,然后专注于强制执行这些用户名。