Скрипт входа в систему принимает все, кроме того, на котором он основан. Почему?

0

Я пытаюсь создать две визуально похожие веб-среды. Один из них должен быть безопасным, а другой - нет. Я полагаю, что все правильно и неправильно, и примеры помогут мне, пока я все еще учусь. Сейчас я занимаюсь регистрацией форм, но в то время как более безопасный код работает правильно, ненадежный код буквально принимает все, даже пустые входы! Я не могу сказать, в чем заключается разница в том, что это происходит.

Это из более безопасной страницы входа в систему.

// 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: marker является формой входа в систему. Существует больше кода выше комментария о входе пользователя в систему. Дайте мне знать, если кто-то хочет его увидеть. Я не знаю, имеет ли это значение. Это работает! Если я вхожу в систему с неправильным именем пользователя или паролем, он это скажет. Если я войду в систему, это будет так.

Это код из более небезопасной версии.

// 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:

Многие из них прокомментированы, потому что я начал с копирования этого из более безопасного кода, который был сделан первым. Этот журнал не имеет значения, и все, что я ввел в ввод имени пользователя, отображается как имя учетной записи. Я даже не знаю, запрашивается ли база данных.

Я ДУМАЮ, что 2-я версия как-то передает вход goto, но я не понимаю, почему это будет работать в первой версии, но не во второй версии. Или, если я пропущу что-то еще! Я сравниваю оба эти бок о бок, пытаясь убедиться, что у всех скобок есть помощники, но я все еще изучаю PHP. Я знаю, что goto ужасен и гнилой, и никто не любит его, но мне кажется, что я использую только то, как он отображается в онлайн-руководстве по PHP, где он выходит из инструкции if, while и for. http://php.net/manual/en/control-structures.goto.php#example-162

Я все еще строю оба из них, поэтому я понимаю, что в первой версии могут быть некоторые большие недостатки, которых нет во второй версии. На самом деле, я сейчас просто завис над этой штукой. Может ли кто-нибудь увидеть, что мне здесь не хватает?

Извините, если вопрос слишком длинный или я совершил некоторые другие faux pas. Это мой первый вопрос.

  • 0
    кое-что, что я предполагаю, mysqli_free_result получил проблему, попытайтесь прокомментировать это
  • 0
    Ooh. Я забыл о mysqli_free_result. Я пытался это комментировать. Сценарий все еще не работает, но спасибо за указание на это. Кто знает, как долго он бы там пробыл ...
Теги:
mysqli

1 ответ

1
Лучший ответ

Ваша проблема связана с тем, что ваш второй "менее безопасный" вариант не проверяет количество строк.

В вашем втором скрипте у вас есть:

$logcheck = mysqli_query(....

и затем вы попытаетесь проверить его

if($logcheck == 0) {..

Это совершенно неправильно, он только вернет mysqli resource или false. Также что mysqli_free_result(); могут вызывать проблемы (как указано в комментариях onegun). Прокомментируйте это и посмотрите, что произойдет.


Другое примечание

Вы должны быть осторожны при использовании goto, особенно если произошла ошибка, вы не сможете проследить ее до своего происхождения, и на самом деле это плохое кодирование, чтобы полагаться на нее.

  • 1
    Это сделал это. Это все еще косметическая ошибка, но она принимает и отвергает все, что должна. Я, вероятно, буду в порядке отсюда. Не могу поверить, что пропустил это. Да, я нервничал, полагаясь на goto, как это, но это было первое, с чем я научился переходить к различным частям кода, поэтому я использовал его много, прежде чем осознал недостатки. Я скоро заменю это. Спасибо! Я бы проголосовал за тебя, но, думаю, мне нужно больше представителей: /
  • 0
    Отлично, приятель! Рад, что смог помочь :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню