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

Форум PHP

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

 

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

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

тема: Аутентификация пользователя
 
 автор: wsnet   (04.01.2013 в 16:49)   письмо автору
 
 

День добрый.

Хотелось бы спросить насчет того случая, когда пользователь включает опцию "Запомнить меня" или что-то в этом стиле, что дает ему возможность заходить в защищенную часть сайта без ввода логина и пароля.

Я делаю так:
1) пользователь ввел логин и пароль
2) в случаи успеха создаем сессию с данными об ид пользователя, и куку с хэшем - неким уникальным значением для каждого логина, которое генерируется на лету здесь же и собственно обновляется в таблице пользователей, там же и хранится
3) далее если пользователь указал "Автологин" делаем запрос к таблице пользователей, в котором проверяем есть ли запись о пользователе с полем хэш, совпадающим с хэшем из куки - если есть создаем сессию с данными об ид пользователя
4) если существует сессионная переменная значит пользователь прошел логин.

Это очень плохой метод или же лучше с куками не сделаешь ? Отказаться от них не хочу.

  Ответить  
 
 автор: tvv123456   (04.01.2013 в 18:19)   письмо автору
 
   для: wsnet   (04.01.2013 в 16:49)
 

Еще стоило бы привязывать эту сессию к ip чтобы если злоумышленик утащит куку, то не смог бы залогиниться

  Ответить  
 
 автор: wsnet   (04.01.2013 в 18:24)   письмо автору
 
   для: tvv123456   (04.01.2013 в 18:19)
 

>Еще стоило бы привязывать эту сессию к ip чтобы если злоумышленик утащит куку, то не смог бы залогиниться

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

  Ответить  
 
 автор: tvv123456   (04.01.2013 в 18:43)   письмо автору
 
   для: wsnet   (04.01.2013 в 18:24)
 

согласен про ip адреса писал, считая что хотя бы минут 15 ip стабилен, но потом дошло, что речь идет о широком диапазоне времени.
Привязывать можно не только к ip: к версии браузера+операционке+разрешение экрана и много что еще можно придумать.
Штука весьма полезная.
Имея на руках только хеш совокупности всей этой информации злоумышлинник заходя на ваш сайт с чужой кукой, вряд ли сможет смоделировать все те факторы к которым вы привязались. Тем самым вы относительно обезопасите пользователя от кражи куки и авторизации на вашем сайте от его имени.
Конечно нужно искать не просто в базе хеш этой куки, а по-новому привязываться к данным пользователя. Таким образом в куку нужно сохранять не сам хеш, который у вас в базе, а какую-то случайную комбинацию salt. А потом дело техники: берем этот salt(не знаю почему так назвал:)+все данные по которым вычисляем хеш, и уже этот хеш ищем в базе.
Для исключения ошибки можно также создать еще одну куку со статическими данными(не с паролем разумеется), и пользователя в базе искать уже по ней, а по динамическому полю просто проверять и принимать решение: авторизовать пользователя или нет

P.S. Для обычной сессии(10-30 минут). Все-таки считаю не лишним включать и ip адрес.

  Ответить  
 
 автор: tvv123456   (04.01.2013 в 19:30)   письмо автору
 
   для: wsnet   (04.01.2013 в 18:24)
 

Так от нечего делать написал реализацию того что написал выше:
<?php
class auth
{
 function 
__construct()
 {
  
$this->agent $_SERVER['HTTP_USER_AGENT'];
  
$this->lang $_SERVER['HTTP_ACCEPT_LANGUAGE'];//меняется редко
 
}

 function 
getSalt()
  {
   return 
md5(time().rand(1000,10000));
  }
  
 function 
setCok()
  {
   
$this->salt $this->getSalt();
   
setcookie('salt',$this->salt,time()+3600*24*30);
  }
 function 
getCok()
   {
    
$this->salt $_COOKIE['salt'];
   }
//использовались классы чтобы можно было безболезнено менять алгоритм хеширования
  
function getHash()
 {
  return 
md5($this->salt.$this->agent.$this->salt.$this->lang.$this->salt);
 }
}

$auth = new auth;
//устанавливаем пользователю куку после успешной авторизации
$auth->setCok();
//получаем хеш с нашей солью
$hash $auth->getHash();
//далее $hash записываем в базу в строку с пользователем
/*==============Автоматическая Авторизация============*/
//вычисляем хеш на основании соли хранящейся в куках
$auth->getCok();
$hash $auth->getHash();
//ищем в базе такой $hash и пишем пользователю авторизацию или просим авторизироваться

  Ответить  
 
 автор: wsnet   (04.01.2013 в 19:44)   письмо автору
 
   для: tvv123456   (04.01.2013 в 19:30)
 

Да кстати кроме этого:

md5($this->salt.$this->agent.$this->salt.$this->lang.$this->salt);


у меня как-раз таки хэш сейчас:

md5(time().rand(1000,10000))


Спасибо огромное за мысли.

  Ответить  
 
 автор: tvv123456   (04.01.2013 в 19:49)   письмо автору
 
   для: wsnet   (04.01.2013 в 19:44)
 

Использовать конечно только браузер и языковые настройки, тоже не сильно обезопасит при краже куки, так как комбинаций получается не так уж и много. Но это так для образца. Можно привязаться еще к чему-нибудь более уникальному.

  Ответить  
 
 автор: wsnet   (04.01.2013 в 19:56)   письмо автору
 
   для: tvv123456   (04.01.2013 в 19:49)
 

Да я понял спасибо, просто в моем приложении безопасность - это не крик души - иначе было использовал сессии.

  Ответить  
 
 автор: Nickiomen   (12.05.2013 в 01:50)   письмо автору
 
   для: tvv123456   (04.01.2013 в 19:30)
 

> $this->salt = $this->getSalt();
извините, что влез, но откуда берется эта переменная?

  Ответить  
 
 автор: psychomc   (12.05.2013 в 02:59)   письмо автору
 
   для: tvv123456   (04.01.2013 в 19:30)
 

очень странная реализация функции getCok. да и вообще..

  Ответить  
Rambler's Top100
вверх

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