PHP如果跳过逻辑?

时间:2014-10-11 15:33:32

标签: php login

我在使用此登录脚本时遇到了一些问题,我已经让其他人为我查看了,我们似乎无法弄清楚问题是什么。

当用户尝试登录时,如果用户名是正确的,它将检查密码是否正确以及密码是否正确,它会更新上次访问日期并重定向。但是,如果用户名正确且密码不正确。它应该清空密码,并让用户知道他们输入的密码是不正确的。 当密码不正确时实际发生的是,它是否跳到最外面的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.";
            }
        }
    }
?>

1 个答案:

答案 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.";
}

您要做的是运行查询以检索给定用户名的(盐渍和散列)密码,然后检查应用程序逻辑中的密码。

另外,正如其他人在评论中指出的那样,这不是存储密码或回复错误信息的好方法。看起来密码是纯文本的,但是应该对它们进行散列和加密。此外,您不应告诉用户哪部分信息不正确;否则,你让攻击者确定有效的用户名,然后专注于强制执行这些用户名。