Кто-нибудь может помочь мне с этой ошибкой в форме входа?

Итак, у меня есть форма входа в систему, которая немного неприятна. Он держит echo ИНГ Incorrect password, please try again., Incorrect password, please try again. когда я пытаюсь получить доступ к странице с ограничениями. У меня была своя скрипка, но я не смог выяснить, что не так. Код выглядит следующим образом:

<!--?php

//MySQL Database connect;

include "databaselogin.php";

//Checks if there is a login cookie

if(isset($_COOKIE["ID_my_site"]))

//If there is a cookie, the user is directed to a restricted page

{

$emailaddress = $_COOKIE["ID_my_site"];

$pass = $_COOKIE["Key_my_site"];

$check = mysql_query("SELECT * FROM Users WHERE EmailAddress='$emailaddress'") or die(mysql_error());

while($info = mysql_fetch_array( $check )) {

 if ($pass != $info["password1"]) {

 }

 else {

 header("location: restricted.php");

 }

}

}

if (isset($_POST["submit"])) { //If the form has been submitted

//Make sure they filled it all in

if(!$_POST["emailaddress"] | !$_POST["password1"]) {

echo("You did not fill in all the required fields.");

}

//Checks it against the database

if (!get_magic_quotes_gpc()) {

$_POST["emailaddress"] = addslashes($_POST["emailaddress"]);

}

$check = mysql_query("SELECT * FROM Users WHERE EmailAddress = '".$_POST["emailaddress"]."'") or die(mysql_error());

//Gives a message if the user doesn't exist

$check2 = mysql_num_rows($check);

if ($check2 == 0) {

echo ("The Email Address that you have entered is not in use, <a href='register.php'-->click here to register");

}

while($info = mysql_fetch_array( $check )) {

$_POST["password1"] = stripslashes($_POST["password1"]);

$info["Password"] = stripslashes($info["Password"]);

$_POST["password1"] = sha1($_POST["password1"]);

//Gives an error is the password is wrong

if ($_POST["password1"] != $info["Password"]) {

 echo("Incorrect password, please try again.");

}

else {

 //If the login is ok, a cookie is added

 $_POST["EmailAddress"] = stripslashes($_POST["EmailAddress"]);

 $hour = time() + 3600;

 setcookie(ID_my_site, $_POST["emailaddress"], $hour);

 setcookie(Key_my_site, $_POST["password1"], $hour);

 //Then they are redirected to a restricted area

 header("location: restricted.php");

}

}

}

else {

//If they are not logged in

?>

<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 

<table border="0"> 

<tbody><tr><td colspan="2"><h2>Login</h2></td></tr> 

<tr><td>Email Address:</td><td> 

 

</td></tr> 

<tr><td>Password:</td><td> 

 

</td></tr> 

<tr><td colspan="2"> 

 

</td></tr> 

</tbody></table> 

</form> 

<!--?php 

}

?-->

Вся помощь будет широко оценена.

2 ответа

Есть несколько проблем. Во-первых, mysql_query - устаревшая функция PHP и ее следует заменить на mysqli_query. Все функции в вашем коде должны использовать префикс mysqli вместо mysql (поэтому mysql_fetch_assoc следует изменить на mysqli_fetch_assoc). Эта функция также принимает параметр, обеспечивающий подключение к базе данных, которое выполняется с помощью mysqli_connect. Поэтому ваш код должен иметь что-то вроде этого:

$con = mysqli_connect($username, $password, $host, $db); // Fill in the variables with correct values
$check = mysqli_query($con, "SELECT * FROM Users WHERE EmailAddress='$emailaddress'");

$con нужно установить только один раз и использовать в других запросах вызовов в коде.


Во-первых, очень опасно, как вы храните свои учетные данные в файлах cookie. Любой, кто имеет доступ к вашему компьютеру или вашей сети, если вы не используете ssl, может украсть ваши файлы cookie и войти в свою учетную запись.

Во-вторых, ваша проблема заключается в

while($info = mysql_fetch_array( $check )) {

это бесконечный цикл. вы должны вызывать это только один раз.

Ваш общий код может использовать некоторые улучшения, такие как:

  • обновить mysql до mysqli или PDO
  • использовать подготовленные заявления
  • оптимизировать код для скорости (используйте || вместо |)
  • используйте более сильный алгоритм хэширования

Оставьте комментарий, если вы хотите, чтобы более глубокая инструкция улучшала ваш код

Надеюсь, что это помогло

улучшения

это отличная статья о PDO. Но PDO основан на объектах, и поскольку вы новичок в PHP, и я не знаю вашего уровня навыков, вы можете лучше использовать mysqli. Существует множество статей о том, как вы можете это сделать.

PDO

в коде, который вы используете

if(!$_POST["emailaddress"] | !$_POST["password1"]) {

но если вы используете || вместо | условие if пропускает второй аргумент, если первый из них уже не выполнен.

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

SHA1 больше не безопасен

Вы никогда не храните информацию о пользователе в сеансе, чтобы сохранить логин при следующих запросах, то, как вы его реализуете, называется функцией "запомнить меня" и считается сложным для реализации безопасно. сначала работать с сессиями проще, и если вам действительно понадобятся куки файлы позже.

Если вы используете сеансы, вы также должны проверить, не был ли session_id установленным злоумышленником в браузере клиентов. Вы можете сделать это, установив случайный файл cookie, такой как init и когда это не установлено, вы вызываете

session_regenerate_id();

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

Чтобы исправить вашу ошибку, вы должны удалить цикл while вокруг mysql_fetch_array($check)

Советы в будущем

Ваш код выглядит намного более организованным, если вы начнете учиться работать с объектами PHP. Это также может сделать ваш проект намного легче работать.

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

licensed under cc by-sa 3.0 with attribution.