登录脚本接受任何东西,但它所基于的脚本可以正常工作。为什么?

Log in script accepts anything but the one it is based off of works fine. Why?

我正在尝试制作两个视觉上相似的网络环境。一个应该是安全的,而另一个则不是。我认为做事是对还是错,在我还在学习的时候有例子会帮助我。现在我正在登录表单,但是虽然更安全的代码可以正常工作,但不安全的代码实际上是在接受所有内容,甚至是空白输入!我无法说出这一切的不同之处。

这是来自更安全的登录页面。

// The user is logging in
} else if (isset($_POST['logsubmit'])) {

// collects value from login form
$loguser = safe_input($_POST['loguser']);
$logpass = md5($_POST['logpass']);

//This section needs encryption
$logcheck1 = mysqli_query($con,"SELECT * FROM users WHERE username ='$loguser'");
$logcheck2 = mysqli_num_rows($logcheck1);
if ($logcheck2 == 0) {
    echo ('There is no record of that username being currently active');
    goto logform;
}
while ($logcheck3 = mysqli_fetch_array($logcheck1)) {
    if ($logpass != $logcheck3['password']) {
        echo ('Incorrect password used.');
        goto logform;
    }
}

display:
$user = mysqli_query($con,"SELECT profile_pic FROM users WHERE username ='$loguser'");
while ($data = mysqli_fetch_array($user)) {
    if ($data['profile_pic'] != NULL) {
        $pic = $data['profile_pic'];
    } else {
        $pic = "img/blank_profile.png";
    }
}
setcookie('testsiteUser',$loguser,time()+3600);
setcookie('testsitePass',$logpass,time()+3600);
echo ('<h2 id="greenborder">Hello, <a id="purpleborder"
href="userpage.php">'.$loguser.'</a>!</h2>
      <img class="profile_bar" src="'.$pic.'">');

?>
<p>
<form action="<?php echo ($_SERVER['PHP_SELF'])?>" method="POST">
<input type="submit" name="logout" value="Log Out">
</form></p>

<?php

} else {
logform:

然后在日志表单之后:标记是登录表单。关于用户登录的评论上面有更多代码。如果有人想看,请告诉我。我不知道这是否相关。 这行得通!如果我用错误的用户名或密码登录,它会这样说。如果我正确登录,它会这样说。

这是更不安全版本的代码。

// The user is logging in
} else if (isset($_POST['logsubmit'])) {

// collects value from login form
$loguser = /*safe_input*/($_POST['loguser']);
$logpass = md5($_POST['logpass']);

/*
//This section needs encryption
$logcheck1 = mysqli_query($con,"SELECT * FROM users WHERE username ='$loguser'");
$logcheck2 = mysqli_num_rows($logcheck1);
if ($logcheck2 == 0) {
    echo ('There is no record of that username being currently active');
    goto logform;
}
while ($logcheck3 = mysqli_fetch_array($logcheck1)) {
    if ($logpass != $logcheck3['password']) {
        echo ('Incorrect password used.');
        goto logform;
    }
}
*/

$logcheck = mysqli_query($con,"SELECT * FROM users WHERE username = '$loguser' AND password = '$logpass'");
mysqli_free_result($logcheck);
if ($logcheck == 0){
    echo ('Incorrect username or password');
    goto logform;
}


//display:
/*$user = mysqli_query($con,"SELECT profile_pic FROM users WHERE username ='$loguser'");*/
/*$userpic = $_SESSION["loguser"];
$user = mysqli_query($con,"SELECT profile_pic FROM users WHERE username ='$userpic'");
while ($data = mysqli_fetch_array($user)) {
    if ($data['profile_pic'] != NULL) {
        $pic = $data['profile_pic'];
    } else {
        $pic = "img/blank_profile.png";
    }
}*/
$_SESSION["loguser"] = $loguser;
echo ('<h2 id="greenborder">Hello, <a id="purpleborder" href="userpage.php">'.$_SESSION["loguser"].'</a>!<h2><p><img class="profile_bar" src="'.$pic.'">');

?>
<p>
<form action="<?php echo ($_SERVER['PHP_SELF'])?>" method="POST">
<input type="submit" name="logout" value="Log Out">
</form></p>

<?php

} else {
logform:

其中很多内容都被注释掉了,因为我首先从最先制作的更安全的代码中复制了它。这无论如何登录,无论我在用户名输入中输入什么,都显示为帐户名。连数据库有没有被查询都不知道

认为 第二个版本不知何故通过了 goto 登录,但我不明白为什么它会在第一个版本而不是第二个版本。或者如果我完全错过了其他东西!我正在并排比较这两个,试图确保所有括号都有配合,但我仍在学习 PHP。我知道 goto 很糟糕而且陈腐,没有人喜欢它,但我觉得我正在使用它在在线 PHP 手册中的显示方式,它来自 if、while 和 for 语句。 http://php.net/manual/en/control-structures.goto.php#example-162

我仍在构建这两个版本,因此我意识到第一个版本中可能存在一些第二个版本中不存在的重大缺陷。我现在真的只是挂断了这件事。谁能看到我在这里遗漏了什么?

抱歉,如果问题太长或者我犯了其他失礼。这是我的第一个问题。

你的问题是因为你的第二个 "less secure" 选项没有检查行数。

在你的第二个脚本中,你有:

$logcheck = mysqli_query(....

然后你试试看

if($logcheck == 0) {..

那是完全错误的,它只会 return 一个 mysqli resourcefalse。此外,mysqli_free_result(); 可能会导致问题(onegun 的评论所述)。把它注释掉,看看会发生什么。


另一个注释

您在使用 goto 时应该小心,特别是如果发生错误,您将无法追踪到它的来源,依赖它实际上是一种糟糕的编码习惯。