Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Авторизация с запоминанием введённый данных
 
 автор: Desh   (08.08.2007 в 19:50)   письмо автору
 
 

Здравствуйте,

PHP начал изучать довольно недавно и вот хочуразрешть одну проблему, которая у меня сложилась.
А проблема следующая: сделал авторизацию с использованием сессий. База пользователей хранится в БД MySQL. Поначалу было норм, а потом возника необходимость сделать "Запоминание" пользователя. Т.е. чтобы при следующем заходе на сайт, он не водил сного свой логин и пароль. Насколько знаю я, это делается с помощь Cookies. Вот только как это сделать я не знаю. Эксперементировал - не выходит.
Вот и хотелось бы узнать как это делается. Оч. важно.

P.S. Вроде бы искал подобные темы на Вашем форуме. Находил несколько подобных, но там описывалось не совсем то, что нужно.

   
 
 автор: cheops   (08.08.2007 в 21:58)   письмо автору
 
   для: 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'];
?>

   
 
 автор: Trianon   (08.08.2007 в 22:04)   письмо автору
 
   для: cheops   (08.08.2007 в 21:58)
 

> $_SESSION['pass'] = $_COOKIE['pass'];

Зачем в сессию помещать пароль? :-(

Заметьте, дабы не устраивать очередную holy war, я не акцентирую внимание на том, что пароль в открытом виде. Но в сессию-то его зачем?

   
 
 автор: cheops   (08.08.2007 в 22:11)   письмо автору
 
   для: Trianon   (08.08.2007 в 22:04)
 

Это лишь учебная схема... безопасность дожимать можно самостоятельно - шифровать пароль, не помещать его в сессию, проверять не насовали ли в cookie SQL-инъекций. Имеется проблема - работа с cookie() - демонстрируется порядок работы. Возникнут вопросы по безопасности - welcome в новую тему - причём для каждого вида защиты, желательно создавать новую тему - иначе темы разрастаются до непотребного вида. В одни пост, даже очень длинный все аспекты не обсудишь - приходится абстрагироваться от задачи, где-то для краткости чуть-чуть не договаривать. Иначе на тему просто отвечать всем будет лень, как представишь, сколько нужно написать, да и читать гиганские трактаты никто не станет.

   
 
 автор: Trianon   (08.08.2007 в 22:25)   письмо автору
 
   для: cheops   (08.08.2007 в 22:11)
 

Резюмирую Ваш ответ: потому что так легче.

   
 
 автор: cheops   (08.08.2007 в 22:51)   письмо автору
 
   для: Trianon   (08.08.2007 в 22:25)
 

Да, потому что сложные вещи делаются в последний момент если на них остаётся время. Именно отсюда растут ноги у декомпозиции, объектно-ориентированной парадигмы - "Разделяй и властвуй".

   
 
 автор: Trianon   (08.08.2007 в 23:00)   письмо автору
 
   для: cheops   (08.08.2007 в 22:51)
 

Аутентификация (которая в заголовке темы ошибочно названа авторизацией) - вопрос сложный по определению. И от проблем безопасности - неотделим.

   
 
 автор: cheops   (09.08.2007 в 07:34)   письмо автору
 
   для: Trianon   (08.08.2007 в 23:00)
 

Вместо того, чтобы разводить флейм, взяли бы мой пост, скопировали, модифицировали как считаете правильным - пользы было бы больше всем (посетителям - посмотрят как надо, мне - я потом на тему ссылаться буду, вам - писать меньше). Об аутентификации, которая ошибочно названа авторизацией речи вообще не идёт, так как после фразы "сделал авторизацию с использованием сессий." и последующего внимательного чтения поста, очевидно, что проблема заключается именно с установкой и чтением cookie. Как аутентификация, ошибочно названная авторизацией, реализована на самом деле - дело Desh - мы не зам.бога, чтобы охватывать бытие во всех проявлениях - вопрос-ответ, а об деталях приложения думает тот, кто приложение собирает, т.е. Desh.

   
 
 автор: Trianon   (09.08.2007 в 09:30)   письмо автору
 
   для: 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"$logintime()+24*3600); 
?>  



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

<?php 
  session_start
();
  
$_SESSION['login'] = $login;
?>

Хотя большого смысла в этом нет. Логин же так или иначе будет присутствовать в переменной $login к этому моменту.

.............................................

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

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

Явная ошибка (из-за чего и разгорелся весь сыр-бор) была такая:
В сессии пароль не нужен. Он пришел из формы логона или из кукиса. Он уже известен скрипту.
Помещать его в сессию только чтобы он там лежал - значит подвергать его лишнему риску быть скомпрометированным.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования