Прежде всего, я тестирую на 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:
Я попытаюсь объяснить оба использования в необработанной форме ниже, поэтому имейте в виду, что о каждом из них нужно узнать больше.
Простота, сеансы уникальны и живут до тех пор, пока страница открыта (или до ее таймаутов). Если ваш браузер закрыт, то это происходит и с сеансом.
Их довольно просто реализовать. Сначала убедитесь, что вы начинаете сеансы в начале каждой страницы:
<?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 «как сеансы», когда вы устанавливали их для истечения срока в $ 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