оставаться в системе функция php
Я делаю php-страницу, которая позволяет пользователю оставаться включенным, и я проверяю текущий IP-адрес пользователей на один, хранящийся в таблице sql. Я храню идентификатор пользователя в cookie, а не ip. Какие еще проверки я должен делать? Поскольку я не думаю, что сейчас IP достаточно.
3 ответа
Это зависит от файлов cookie, чтобы пользователи могли оставаться в вашем приложении или на веб-сайте. Пользовательский IP-адрес может быть изменен, поэтому он не применим для получения этой функции. Он просто пишет cookie, а затем читает его при входе в систему.
Как идея, это должно быть хеширование для пользовательского свойства, такого как user_id или username, и запись его в cookie. когда пользователь снова посещает приложение и приложение требует входа в систему, оно проверяет и читает cookie, а затем сравнивает хэш с хэшем имени пользователя, если они одинаковы, пользователь настроен для входа в систему.
Хэшированный сеансовый файл cookie хорош для того, чтобы пользователь вошел в систему. Это потому, что файл cookie остается на пользовательском компьютере и позволяет ему получать доступ к данным сеанса. Хеширование добавляет уровень безопасности.
IP-адрес пользователя не так хорош, как cookie или переменная сеанса. Во-первых, он может измениться (как в смартфоне, движущемся от одного диапазона башни к другому). С другой стороны, он может использоваться совместно (как у нескольких пользователей, работающих на одном и том же беспроводном маршрутизаторе). Наконец, IP-адреса могут быть подделаны.
Сессии, с другой стороны, будут продолжаться только до тех пор, пока браузер будет открыт (с учетом тайм-аутов сеанса, установленных на стороне сервера). В этом случае сеанс устанавливает один сеансовый файл cookie, который позволяет браузеру указывать на данные сеанса на сервере.
Данные сеанса гораздо более безопасны, поскольку этот один сеансовый файл cookie — это все, что находится на компьютере пользователя в течение всего сеанса браузера. Таким образом, вы можете хранить на сервере более важные данные (имя пользователя, личную информацию или данные учетной записи).
Единственный способ получить доступ к данным сеанса — через этого пользователя один единственный cookie сеанса, который обычно является очень длинной строкой случайных символов. Хеширование это очень затрудняет разборку.
После авторизации пользователь должен оставаться в системе на 2 часа
Вывести рандомно число в двоичной системе, пользователь должен дать ответ, а пк его сравнить и выдать True or False
Доброе время суток. Есть определённая задача программы, надо вывести рандомно число в двоичной.
Как сделать так, чтобы пользователь мог выполнять определенные действия на сайте только после авторизации?
Здравствуйте, уважаемые товарищи программисты и сисадмины! У меня есть такая проблема: я создаю.
Сообщение было отмечено Dreamfactor как решение
Решение
session_set_cookie_params(3600*2); session_start();
setcookie("TestCookie", "value", time()+(3600*2));
Оставаться залогиненным после выхода из приложения
В общем, есть приложение с функцией регистрации/входа, и каждый раз, когда запускаешь его.
Значения формы должны оставаться после перезагрузки
привет, пожалуйста, помогите с этой задачей. на пример имею регистрационную форму, 2 поля имя и.
Работа с сессиями
Простая авторизация
$_SESSION — ассоциативный массив, содержащий переменные сессии, которые доступны для текущего скрипта. Это суперглобальная переменная , она доступна во всех контекстах скрипта.
Сессия — очень полезная возможность, которая позволяет, в том числе, передавать данные между страницами.
Это значит, коль $_SESSION — глобальный массив, то если мы запишем в него какие-то данные на одной странице, то эти данные будут доступны на другой странице на протяжении всей сессии (на протяжении всего сеанса), чего нет с любыми другими массивами. Конец сессии или сеанса — это закрытие браузера .
Для работы с сессиями существуют специальные функции: php.net
Наиболее полезные функции для работы с сессиями
session_start — открывает сессию, либо возобновляет ее, если файл сессии был найден.
session_unset — она удаляет все переменные текущей сессии.
session_destroy — уничтожает все данные, связанные с текущей сессией. Данная функция не удаляет какие-либо глобальные переменные, связанные с сессией и не удаляет сессионные cookie.
session_id — эта функция используется для получения или установки идентификатора текущей сессии.
session_name — возвращает имя текущей сессии. Если задан параметр name, session_name() обновит имя сессии и вернет старое имя сессии.
Открытие сессии
session_start — это та функция, которую мы должны выполнить, перед тем, как работать с сессиями. Данная функция запускает или открывает сессию и по сути, поскольку нам необходимо хранить данные, которые будут доступны между страницами, то сессия — это ничто иное как файл, который хранится во временной папке (эта папка будет хранится в папке: userdata/temp для Open Server ) В этот текстовый файл записываются все те данные, которые мы сохраняем в сессию. И когда мы запускаем на выполнение функцию session_start , то она создает такой файл либо обращается к нему, если файл уже был создан ранее. Причем этот файл индивидуален для каждой открытой сессии. Это значит, что если мы обратимся к одному и тому же скрипту из двух различных браузеров, то под каждый браузер, под каждого клиента будет открыт свой файл сессии и эти файлы никак друг с другом не пересекаются. Из этого следует, что с помощью сессий, мы можем организовать механизм аторизации пользователя, то есть получения доступа к какой-то закрытой части сайта.
Для того, чтобы понять, что данный файл принадлежит конкретному клиенту — делается это посредством куки .
Куки — это тот же самый файл, который хранится не на сервере, а на стороне клиента (в браузере), в нем содержится индификатор , который совпадает с идификатором файла , который лежит на сервере.
Запись и получение данных из сессии
Создадим простое приложение, с секретной страницей, доступ к которой будет иметь только пользователь, который введет правильные данные.
Для примера создадим три файла: sess1.php, sess2.php и secret.php
В файле sess1.php запишем в массив $_SESSION имя Андрей . При обновлении страницы в браузере это имя — выведится.
Функция session_start чувствительна к выводу — перед вызовом данной функции не должно быть никакого вывода в браузер . Если поставить перенос строки, который является выводом в браузер, то возникнет ошибка.
// здесь ничего не должно быть
session_start (); // открываем сессию
echo session_id (); // индификатор сессии, который равен значению куки
$_SESSION [ ‘name’ ]= ‘Андрей’; // запишем в массив имя
echo $_SESSION [ ‘name’ ]; // выводим $_SESSION[‘name’]
// выведет: Андрей
// в файле сессии будет записано: name|s:12:»Андрей»;
?>
После обновлении страницы получим:
В файле сессии будет сделана запись: name|s:12:»Андрей» — сериализованная строка — это один из способов хранения массивов данных, где:
— name — ключ
— s:12 — длина строки в байтах (в кодировке utf-8, буквы кирилицы равны двум байтам)
— Андрей — содержимое $_SESSION[‘name’]
Если закомментировать строку $_SESSION[‘name’]= ‘Андрей’ , то в браузере, при обнавлении все равно выведится имя Андрей, это значит, что в сессии эти данные были запомненны . В этом можно убедиться, открыв файл сессии.
В файле sess2.php откраваем сессию и получаем доступ, к тому, что лежит в сессии — к тому же $_SESSION[‘name’] .
session_start (); // открываем сессию
echo $_SESSION [ ‘name’ ]; // выводим $_SESSION[‘name’]
// выведет: Андрей
?>
Удаление данных из сессии
Если мы хотим удалить из сессии конкретное значени можно использовать функцию unset() , которая удаляет переменную — в данном случае нам надо удалить — $_SESSION[‘name’] . И удалив его, на какой то странице (на sess1.php), мы удаляем его целиком из сессии.
Если нам нужно удалить все значения сессии , то есть все переменные массива , можно использовать специальную функцию session_unset() которая удалит все сессионные переменные. Сессионый файл будет очищен.
Если мы хотим уничтожить сессию, включая и сам сессионный файл, — для этого используется функция session_destroy , хотя в куки он у нас остался и если закомментировать строку , то файл сессии вновь образуется.
session_start (); // открываем сессию
$_SESSION [ ‘name’ ]= ‘Андрей’ ; // запишем в массив имя
$_SESSION [ ‘login’ ]= ‘andrey’ ; // запишем в массив логин
echo $_SESSION [ ‘name’ ]; // выводим $_SESSION[‘name’]
// выведет: Андрей
// в файле сессии будет записано: name|s:12:»Андрей»;
unset ( $_SESSION [ ‘name’ ]); // удаляем из сессии конкретное значение
session_unset (); // удаляет из сессии все переменные
session_destroy (); // уничтожает сессию, включая и сам сессионный файл
?>
Простая авторизация
Создадим пункты меню и поместим их в каждый из файлов: sess1.php , sess2.php и secret.php . Наша задача — ограничить доступ к странице secret .
Что бы ограничить доступ к странице secret.php мы задаем простое условие (авторизация будет происходить по логину):
Если у нас не существует ( !isset ) в сессии ( $_SESSION ) элемент ( admin ) — мы завершим работу и выведем: «Вы не авторизованы!» ,
( die или exit — вывести сообщение и прекратить выполнение текущего скрипта)
если мы прошли проверку, то выведем: «Добро пожаловать, «
session_start() ; // открываем сессию
if ( ! isset ( $_SESSION [ ‘admin’ ])) die ( ‘Вы не авторизованы!’ );
echo «Добро пожаловать, < $_SESSION [ 'admin' ]>» ;
?>
На странице файл sess1.php создадим форму авторизации:
— action=»» — обработчик будет на этой же странице
— method=»post» — метод POST
— input type=»text» — поле ввода
— name=»login» — имя «login»
— type=»submit» — кнопка тип «submit»
— Login — надпись
Далее нам необходимо принять данные из формы: если не пуст ( !empty ) элемент с ключем login ( $_POST[‘login’] ), то мы должны сравнить, то что передал пользователь с каким-то нашим логином — с тем логином, который мы разрешаем для авторизации. Его определим в виде константы: имя константы — ADMIN , значение — строка admin — такой логин будет разрешен.
Далее проверяем: если у нас $_POST[‘login’] будет равен значению константы ADMIN , мы должны записать что-то в сессию, а именно создать сессионную переменную $_SESSION[‘admin’] = ADMIN , и выведем сообщение: «Вы успешно авторизовались!» .
В противном случае выведем: «Неверный логин» .
// определяем константу для сравнения с логином пользователя
define ( ‘ADMIN’ , ‘admin’ );
// открываем сессию
session_start();
// принимаем данные из формы
if (! empty ( $_POST [ ‘login’ ])) <
// создаем сессионную переменную
if ( $_POST [ ‘login’ ] === ADMIN ) <
$_SESSION [ ‘admin’ ] = ADMIN ;
echo ‘Вы успешно авторизовались!’ ;
> else echo ‘Неверный логин’ ;
>
>
?>
Избавление от проблемы F5
При обновлении страницы возникает проблема F5.
Чтобы избавиться от этой проблемы нам надо перезапросить страницу . Чтобы перезапросить страницу средствами PHP, мы можем сделать редирект : header(«location: sess1.php») . И для того, чтобы дальше ничего не выполнялось, мы должны завершить выполнение скрипта: die , а чтобы получить сообщение о регистрации его надо записать в сессию : $_SESSION[‘res’] = ‘Вы успешно авторизовались!’ и вывести: если у нас существует (if(isset)) в сессии $_SESSION элемент [‘res’] , то выведем его echo $_SESSION[‘res’] .
То же самое мы можем сделать и для ошибки: $_SESSION[‘res’] = ‘Неверный логин’ , И редирект теперь нужен для любого случая, и в случае ошибки, и в случае успеха. Вынесем его за пределы условий.
Удалим ненужную переменную из сессии: unset($_SESSION[‘res’]) .
// открываем сессию
session_start ();
// определяем константу для сравнения с логином пользователя
define ( ‘ADMIN’ , ‘admin’ );
// принимаем данные из формы
// если у нас что-то пришло POST-ом
if ( ! empty ( $_POST [ ‘login’ ])) <
// и если это равно константе ADMIN
if ( $_POST [ ‘login’ ] === ADMIN ) <
// тогда мы создадим сессионную переменную,
// чтобы мы могли попасть на страницу secret
$_SESSION [ ‘admin’ ] = ADMIN ;
// записываем сообщение в сессию об успехе
$_SESSION [ ‘res’ ] = ‘Вы успешно авторизовались!’ ;
Механизм выхода из сессии
В файле secret.php реализуем механизм выхода. При его работе из сессии будет удалятся сессионная переменная $_SESSION[‘admin’] и пользователь без авторизации не получит сюда доступ.
Ссылка для выхода из сессии:
В результате в массиве GET ( в командной строке ) получим: secret.php?do=exit , то есть, у нас появится элемент do со значением exit .
Это значит, что мы можем добавить условие :
if ( isset ( $_GET [ ‘do’ ] && $_GET [ ‘do’ ] == ‘exit’ )) <
unset ( $_SESSION [ ‘admin’ ]); // удаляем сессионную переменную
header ( «Location: sess1.php» ); // делаем редирект
die ; // и завершаем выполнение скрипта
>
-если у нас существует в массиве $_GET элемент do и при этом $_GET[‘do’] равняется строке exit , то мы удалим сессионную переменную $_SESSION[‘admin’] .
Далее можно опять перезапросить страницу. (редирект: header(«location: sess1.php») ).