|
|
|
| Здравствуйте,
PHP начал изучать довольно недавно и вот хочуразрешть одну проблему, которая у меня сложилась.
А проблема следующая: сделал авторизацию с использованием сессий. База пользователей хранится в БД MySQL. Поначалу было норм, а потом возника необходимость сделать "Запоминание" пользователя. Т.е. чтобы при следующем заходе на сайт, он не водил сного свой логин и пароль. Насколько знаю я, это делается с помощь Cookies. Вот только как это сделать я не знаю. Эксперементировал - не выходит.
Вот и хотелось бы узнать как это делается. Оч. важно.
P.S. Вроде бы искал подобные темы на Вашем форуме. Находил несколько подобных, но там описывалось не совсем то, что нужно. | |
|
|
|
|
|
|
|
для: Desh
(08.08.2007 в 19:50)
| | При авторизации помещайте логин и пароль в cookie при помощи функции setcookie(), указывая время их хранения (если не указывать - они уничтожаются при выключении браузера):
<?php
// Устанавливаем cookie на 24 часа
setcookie("login", $_SESSION['login'], time()+24*3600);
setcookie("pass", $_SESSION['pass'], time()+24*3600);
?>
|
Только setcookie() следует как и session_start() и header() вызывать до любого вывода текста в окно браузера, так как эти функции оперируют HTTP-заголовками. Затем при следующем заходе пользователя проверяйте установлены ли у него cookie и соответствуют ли они тому, что размещено в базе данных - т.е. проводите авторизацию с использованием значений $_COOKIE['login'] и $_COOKIE['pass'] в качестве входных
<?php
if(isset($_COOKIE['login']) && isset($_COOKIE['pass']))
{
// Авторизация
}
?>
|
Разумеется значения $_COOKIE['login'] и $_COOKIE['pass'] - следует обезопасить, чтобы не допустить SQL-инъекцию, так как в cookie пользователь может записать всё что ему заблагорассудится, в том числе и зловредный код.
Если cookie установлены и пароль соответствует логину - присваивайте значение cookie переменным из сесиии
<?php
$_SESSION['login'] = $_COOKIE['login'];
$_SESSION['pass'] = $_COOKIE['pass'];
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(08.08.2007 в 21:58)
| | > $_SESSION['pass'] = $_COOKIE['pass'];
Зачем в сессию помещать пароль? :-(
Заметьте, дабы не устраивать очередную holy war, я не акцентирую внимание на том, что пароль в открытом виде. Но в сессию-то его зачем? | |
|
|
|
|
|
|
|
для: Trianon
(08.08.2007 в 22:04)
| | Это лишь учебная схема... безопасность дожимать можно самостоятельно - шифровать пароль, не помещать его в сессию, проверять не насовали ли в cookie SQL-инъекций. Имеется проблема - работа с cookie() - демонстрируется порядок работы. Возникнут вопросы по безопасности - welcome в новую тему - причём для каждого вида защиты, желательно создавать новую тему - иначе темы разрастаются до непотребного вида. В одни пост, даже очень длинный все аспекты не обсудишь - приходится абстрагироваться от задачи, где-то для краткости чуть-чуть не договаривать. Иначе на тему просто отвечать всем будет лень, как представишь, сколько нужно написать, да и читать гиганские трактаты никто не станет. | |
|
|
|
|
|
|
|
для: cheops
(08.08.2007 в 22:11)
| | Резюмирую Ваш ответ: потому что так легче. | |
|
|
|
|
|
|
|
для: Trianon
(08.08.2007 в 22:25)
| | Да, потому что сложные вещи делаются в последний момент если на них остаётся время. Именно отсюда растут ноги у декомпозиции, объектно-ориентированной парадигмы - "Разделяй и властвуй". | |
|
|
|
|
|
|
|
для: cheops
(08.08.2007 в 22:51)
| | Аутентификация (которая в заголовке темы ошибочно названа авторизацией) - вопрос сложный по определению. И от проблем безопасности - неотделим. | |
|
|
|
|
|
|
|
для: Trianon
(08.08.2007 в 23:00)
| | Вместо того, чтобы разводить флейм, взяли бы мой пост, скопировали, модифицировали как считаете правильным - пользы было бы больше всем (посетителям - посмотрят как надо, мне - я потом на тему ссылаться буду, вам - писать меньше). Об аутентификации, которая ошибочно названа авторизацией речи вообще не идёт, так как после фразы "сделал авторизацию с использованием сессий." и последующего внимательного чтения поста, очевидно, что проблема заключается именно с установкой и чтением cookie. Как аутентификация, ошибочно названная авторизацией, реализована на самом деле - дело Desh - мы не зам.бога, чтобы охватывать бытие во всех проявлениях - вопрос-ответ, а об деталях приложения думает тот, кто приложение собирает, т.е. Desh. | |
|
|
|
|
|
|
|
для: cheops
(09.08.2007 в 07:34)
| | Я не развожу флейм.
Если проблема лишь в авторизации - не нужно было вообще помещать в код операции с паролем. Для авторизации никакой пароль не нужен - нужен только логин.
Исправленный код выглядит так:
<?php
if(isset($_POST['login'])) // пользователь указал логин в форме
$login = $_POST['login']; // авторизация
else if(isset($_COOKIE['login'])) // компьютер передал логин из кукиса
$login = $_COOKIE['login']; // автологон
// Устанавливаем cookie на 24 часа
setcookie("login", $login, time()+24*3600);
?>
|
В этом случае логин фигурирует только в качестве имени посетителя, и в принципе, может быть помещен сессию, как сущность, связанная с текущим сеансом посетителя.
<?php
session_start();
$_SESSION['login'] = $login;
?>
|
Хотя большого смысла в этом нет. Логин же так или иначе будет присутствовать в переменной $login к этому моменту.
.............................................
Пароль требуется для аутентификации. Если по Вашему мнению автор темы в ней не нуждался - этого кода достаточно.
Если нуждался, и если Вы согласились раскрывать тему - раскрывайте без ошибок.
Явная ошибка (из-за чего и разгорелся весь сыр-бор) была такая:
В сессии пароль не нужен. Он пришел из формы логона или из кукиса. Он уже известен скрипту.
Помещать его в сессию только чтобы он там лежал - значит подвергать его лишнему риску быть скомпрометированным. | |
|
|
|