Как подключить пользователя к файлу cookie для входа в PHP?

Прежде всего, я тестирую на localhost. У меня есть этот файл index.php, который содержит следующее «помнить меня»:

<input type="checkbox" id="login_remember" name="login_remember"> 

Форма входа в систему для loginvalidate.php, которая включает следующий скрипт php. Я включил много комментариев, чтобы облегчить процесс чтения моего кода. Обратите внимание, что я уверен, что все ниже работает отлично.

 if (isset($_POST['login_submit'])) { //SETS VARIABLES FROM FORM $email = $_POST[trim('login_email')]; $password = $_POST['login_password']; $remember = isset($_POST['login_remember']) ? '1' : '0'; $db_found = mysqli_select_db($db_handle,$sql_database); //OPENING TABLE $query = "SELECT password FROM registeredusers WHERE email = '$email'"; $result = mysqli_query($db_handle, $query) or die (mysqli_error($db_handle)); $row = mysqli_fetch_assoc($result); $numrows = mysqli_num_rows($result); if ($numrows!=0) //IF EMAIL IS REGISTERED { if ($row['password'] == $password) { //IF PASSWORD IN DATABASE == PASSWORD INPUT FROM FORM if ($remember == '1'){ //IF USER WANTS TO BE REMEMBERED $randomNumber = rand(99,999999); //RANDOM NUMBER TO SERVE AS A KEY $token = dechex(($randomNumber*$randomNumber)); //CONVERT NUMBER TO HEXADECIMAL FORM $key = sha1($token . $randomNumber); $timeNow = time()*60*60*24*365*30; //STOCKS 30 YEARS IN THE VAR $sql_database = "registeredusers"; $sql_table = "rememberme"; $db_found = mysqli_select_db($db_handle,$sql_database); //OPENING TABLE $query_remember = "SELECT email FROM rememberme WHERE email = '$email'"; //IS THE USER IN TABLE ALREADY $result = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle)); if (mysqli_num_rows($result) > 0) { //IF USER IS ALREADY IN THE REMEMBERME TABLE $query_update = "UPDATE rememberme SET email = '$email' user_token = '$token' token_salt = '$randomNumber' time = '$timeNow'"; } else { //OTHERWISE, INSERT USER IN REMEMBERME TABLE $query_insert = "INSERT INTO rememberme VALUES( '$email', '$token', '$randomNumber', '$timeNow' )"; } setcookie("rememberme", $email . "," . $key, $timenow); } header('Location: homepage.php'); //REDIRECTS: SUCCESSFUL LOGIN exit(); } 

Затем, когда я закрываю интернет-браузер и возвращаюсь к index.php, я хочу, чтобы файл cookie автоматически подключался к пользователю. Это в моем index.php:

 include 'db_connect.php'; $sql_database = "registeredusers"; $db_found = mysqli_select_db($db_handle,$sql_database); //OPENING TABLE session_start(); if (isset($_COOKIE['rememberme'])) { $rememberme = explode(",", $_COOKIE["rememberme"]); $cookie_email = $rememberme[0]; $cookie_key = $rememberme[1]; $query_remember = "SELECT * FROM rememberme WHERE email = '$cookie_email'"; //IS THE USER IN TABLE ALREADY $result_remember = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle)); $row = mysqli_fetch_assoc($result_remember); $token = $row['user_token']; $randomNumber = $row['token_salt']; $key = sha1($token . $randomNumber); //ENCRYPT TOKEN USING SHA1 AND THE RANDOMNUMBER AS SALT if ($key == $cookie_key){ echo "lol"; } } 

Проблема в том, что она никогда не повторяет «lol». Кроме того, есть ли у кого-нибудь представление о том, как я могу подключить пользователей? AKA, что должно идти внутри этих строк:

 if ($key == $cookie_key){ echo "lol"; } 

Спасибо! Я все еще новичок в PHP и SQL, поэтому, пожалуйста, несите меня, если я сделал некоторые ошибки начинающего.

EDIT !: После того, как я снова и снова смотрел на свой код, я думаю, что моя ошибка может лежать в этих строках. Я не уверен в синтаксисе и методе, который я использую, чтобы хранить значения в $ токене и $ randomNumber:

 $query_remember = "SELECT * FROM rememberme WHERE email = '$cookie_email'"; //IS THE USER IN TABLE ALREADY $result_remember = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle)); $row = mysqli_fetch_assoc($result_remember); $token = $row['user_token']; $randomNumber = $row['token_salt']; 

Существует два основных способа реализации скрипта входа в PHP:

  1. Использование сеансов
  2. Использование файлов cookie

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

Использование сеансов

Простота, сеансы уникальны и живут до тех пор, пока страница открыта (или до ее таймаутов). Если ваш браузер закрыт, то это происходит и с сеансом.

Как это использовать?

Их довольно просто реализовать. Сначала убедитесь, что вы начинаете сеансы в начале каждой страницы:

 <?php session_start(); ?> 

Примечание. Важно, чтобы этот вызов дошел до выхода любой страницы , или это приведет к ошибке «отправленные заголовки».

Хорошо, теперь ваша сессия работает. Что делать дальше? Это довольно просто: пользователь отправляет его логин / пароль через форму для входа, и вы проверяете его. Если логин действителен, сохраните его в сеансе:

 if($validLoginCredentials){ $_SESSION['user_id'] = $id; $_SESSION['user_login'] = $login; $_SESSION['user_name'] = $name; } 

или как массив (который я предпочитаю):

 if($validLoginCredentials){ $_SESSION['user'] = array( 'name' => $name, 'login' => 'login', 'whichever_more' => $informationYouNeedToStore ); } 

Хорошо, теперь ваш пользователь вошел в систему. Так как вы можете узнать / проверить это? Просто проверьте, существует ли сеанс пользователя.

 if(isset($_SESSION['user_id'])){ // OR isset($_SESSION['user']), if array // Logged In }else{ // Not logged in :( } 

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

В простейшем приложении никогда не будет $ _SESSION ['user'], если вы не установите его вручную в действии входа. Итак, просто проверяя, существует ли это существование, вы узнаете, вошел ли пользователь в систему или нет.

Loggin: просто уничтожьте его. Вы можете использовать

 session_destroy(); 

Но имейте в виду, что это уничтожит все сеансы, которые вы настроили для этого пользователя. Если вы также использовали $ _SESSION ['foo'] и $ _SESSION ['bar'], они тоже исчезнут. В этом случае просто отключите конкретный сеанс:

 unset($_SESSION['user']); 

И сделано! Пользователь больше не в сети! 🙂

Использование файлов cookie

Файлы cookie работают несколько одинаковыми сессиями, за исключением того, что они хранятся в клиентском браузере и сохраняются до тех пор, пока вы им рассказываете. Например, вы использовали файлы cookie «как сеансы», когда вы устанавливали их для истечения срока в $ timeNow .

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

Как это использовать?

Практически так же, как и сеансы. Разница заключается в настройке / отключении файла cookie:

 // To set a Cookie // You could use the array to store several user info in one cookie $user = array( 'id' => $id, 'name' => $name, 'login' => $login, ) setcookie("loginCredentials", $user, time() * 7200); // Expiring after 2 hours // Now to log off, just set the cookie to blank and as already expired setcookie("loginCredentials", "", time() - 3600); // "Expires" 1 hour ago 

Чтобы проверить, вошел ли пользователь в систему, вы можете использовать тот же пример, что и в сеансе, но используя другую переменную: $ _COOKIE

 if(isset($_COOKIE['user']['id'] && !empty(isset($_COOKIE['user']['id']))){ // Logged In }else{ // Not logged in :( } 

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

причина, по которой ваш код не работает, – это

  setcookie("rememberme", $email . "," . $key, $timenow); // this is getting expire exactly at same time when it is set 

замените его

  setcookie("rememberme", $email . "," . $key, time() * 3600);//expire after 1hour