Я пытаюсь создать две визуально похожие веб-среды. Один из них должен быть безопасным, а другой - нет. Я полагаю, что все правильно и неправильно, и примеры помогут мне, пока я все еще учусь. Сейчас я занимаюсь регистрацией форм, но в то время как более безопасный код работает правильно, ненадежный код буквально принимает все, даже пустые входы! Я не могу сказать, в чем заключается разница в том, что это происходит.
Это из более безопасной страницы входа в систему.
// 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. Это мой первый вопрос.
Ваша проблема связана с тем, что ваш второй "менее безопасный" вариант не проверяет количество строк.
В вашем втором скрипте у вас есть:
$logcheck = mysqli_query(....
и затем вы попытаетесь проверить его
if($logcheck == 0) {..
Это совершенно неправильно, он только вернет mysqli resource
или false
. Также что mysqli_free_result();
могут вызывать проблемы (как указано в комментариях onegun
). Прокомментируйте это и посмотрите, что произойдет.
Другое примечание
Вы должны быть осторожны при использовании goto
, особенно если произошла ошибка, вы не сможете проследить ее до своего происхождения, и на самом деле это плохое кодирование, чтобы полагаться на нее.