登录脚本接受除它所基于的脚本之外的任何内容都可以正常工作.为什么


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:

然后在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

我仍在构建这两个版本,所以我意识到第一个版本中可能存在一些在第二个版本中不存在的大缺陷。我现在真的只是挂断了这一件事。谁能看到我在这里缺少的东西?

对不起,如果问题太长或我犯了一些其他失礼。这是我的第一个问题。

您的问题是因为您的第二个"不太安全"选项没有检查行数。

在第二个脚本中,您有:

$logcheck = mysqli_query(....

然后你尝试检查它

if($logcheck == 0) {..

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


另一个注意事项

使用goto时应该小心,特别是如果发生错误,您将无法将其追溯到其来源,并且依赖它实际上是不好的编码实践。

相关文章: