Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Хранение данных пользователя [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (6): « 1 [2] 3 4 5 6 »   

> Описание: оцените вариант
Мелкий Супермодератор
Отправлено: 18 Августа, 2013 - 20:15:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




caballero пишет:
боты которые курлом ходят

Боты с курлом в яндекс-метрике не отобразятся. Зачем им метрику тягать-то?

Hapson пишет:
Судя по яндекс метрике моего сайта, с февраля этого года, куки включены у 99,33% пользователей.

И это по метрике, т.е. куки третьей стороны. Что не означает, что куки были выключены совсем.


-----
PostgreSQL DBA
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 20:21:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Короче говоря - у кого куки выключены, те пусть идут лесом.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Vinyl
Отправлено: 18 Августа, 2013 - 20:33:51
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Или я Вас не пойму, или Вы фигнёй занимаетесь.

Когда проходит процесс авторизации, нужно сделать выборку из базы, чтобы проверить пароль. Заодно выберите и все данные юзера, которые могут пригодиться в дальнейшем, и держите их свойствами класса / массивом. В любом месте приложения (авторизация все равно должна быть выше мест, в которых понадобятся различные данные пользователя, по логике, иначе приложение кривое) пишете что-то типа $user->email - вот Вам и email, $user->hash - вот Вам и хэш пароля. Это при авторизации.

Потом, при каждом запросе к движку в любом случае должна проходить аутентификация, при которой все равно придется лезть в БД за хешем пароля (либо токеном), делаете то же самое, что я описал выше.

P.S. Я сессиями вообще не пользуюсь, у меня везде авторизация устроена так:


Авторизация: (цель - поставить токен, либо отправить обратно к форме)
  • Приходит POST из формы входа
  • Идем в таблицу users базы данных, выбираем все поля, включая хэш, соль, мыло, имя, фамилию, и т.д., складываем это в массив $user->data
  • Проверяем на соответствие данные из POST с данными из БД
  • Если все совпало, добавляем токен в таблицу tokens, который содержит сам токен + IP + UA + ID пользователя + Кол-во неудачных попыток входа + можно ещё чего-нибудь придумать
  • Ставим куку с самим токеном
  • На всякий случай убиваем $user->hash и $user->salt, они нам больше не нужны



Аутентификация: (цель - проверить токен и узнать, что за пользователь тут)
  • Смотрим в куку
  • Идем в таблицу tokens базы данных, выбираем все поля
  • Проверяем на соответствие данные из POST+$_SERVER с данными из БД
  • Если все совпало, делаем выборку из users, собираем в массив $user->data



При этом у меня аутентификация проходит вообще при каждом обращении к движку, даже при авторизации, т.е., сам процесс авторизации только лишь проверяет пару логин-пароль и ставит токен. При таком подходе очень удобно хранить данные в объекте User, никаких файлов и сессий. Выборка из базы два раза при авторизации и один раз при обычной работе приложения.


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
Squirrel
Отправлено: 18 Августа, 2013 - 21:09:01
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


Vinyl пишет:
Или я Вас не пойму, или Вы фигнёй занимаетесь.

Судя по всему второе, плюс активное нежелание учится.
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 21:15:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Vinyl пишет:
Выборка из базы два раза при авторизации и один раз при обычной работе приложения

Вот именно, каждое обновление страницы - выборка из базы. Зачем?
Я делаю так:

Авторизация:

Принял пост из которого мне нужен email и passowrd.
Выбираю из базы все данные на пользователя по email, если есть такой email.
Сравниваю password
Если совпадает, то заполняю свойства объекта $user данными из БД. Среди свойств есть уникальный идентификатор, за которым не нужно лезть в базу. Ну например это хеш какогото свойства + юзер-агент
Кидаю объект $user в сессию.
Ставлю куку.
Перезапрос страницы и далее

Аутентификация:

Смотрю, есть ли в сессии уникальный идентификатор и сравниваю его.
Если подходит, то заполняю свойства объекта из сессии
Все - нет запроса в БД.

А если в сессии нет того что нужно, то тогда уже проверяю куку. Если она есть, то для ее проверки нужно залезть в БД.

Однако при навигации по сайту аутентификация держится на сессии и нет никаких запросов в БД. А чтобы куку сравнить, это можно и в БД сходить - это один раз.
(Добавление)
Squirrel пишет:
Vinyl пишет:
Или я Вас не пойму, или Вы фигнёй занимаетесь.

Судя по всему второе, плюс активное нежелание учится.

Вы не поверите, я все свободное время учусь и ищу самые лучшие реализации разных вещей Улыбка


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Vinyl
Отправлено: 18 Августа, 2013 - 21:20:41
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Hapson пишет:
Смотрю, есть ли в сессии уникальный идентификатор и сравниваю его

C чем?


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
caballero
Отправлено: 18 Августа, 2013 - 21:25:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Ставлю куку.

зачем?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 21:27:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Vinyl пишет:
Hapson пишет:
Смотрю, есть ли в сессии уникальный идентификатор и сравниваю его

C чем?

Если есть этот идентификатор, то значит есть и все остальное (свойства объекта $user). А идентификатор это хеш какого-то свойства + например юзер_агент
(Добавление)
caballero пишет:
Цитата:
Ставлю куку.

зачем?

Галочка "запомнить на 2 недели"
(Добавление)
Vinyl
Если точно, то сейчас в сессию кладется
PHP:
скопировать код в буфер обмена
  1. md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'])

вместе со свойствами юзера.

Да, это коряво, я думаю над этим - из чего лепить идентификатор, за которым не нужно лезть в БД
(Добавление)
Hapson пишет:
Да, это коряво, я думаю над этим - из чего лепить идентификатор, за которым не нужно лезть в БД

Хотя, почему же коряво, мне кажется нормально.
md5([юзер-агент]+[IP]+[email])
email у меня вместо логина, то есть уникальный. IP в течении сессии не меняется. А юзер-агент... ну и флаг с ним


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
LIME
Отправлено: 18 Августа, 2013 - 22:03:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




нет не коряво
я просто ip храню в сессии
в подавляющем большинстве случаев этого более чем достаточно
если у пользака с того же ip прилетел тот же SID то все ок
если SID перехватят то ip не подделают
(Добавление)
Vinyl пишет:
Потом, при каждом запросе к движку в любом случае должна проходить аутентификация, при которой все равно придется лезть в БД за хешем пароля
совсем не обязательно
достаточно проверить ip из сессии
(Добавление)
LIME пишет:
совсем не обязательно
даже будетлишним
 
 Top
Vinyl
Отправлено: 18 Августа, 2013 - 22:30:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




LIME пишет:
даже будетлишним
У каждого своя точка зрения на этот счет, иначе, были бы как с инкубатора Подмигивание

Да и сессии я, признаться, не очень люблю.


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
LIME
Отправлено: 18 Августа, 2013 - 22:35:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




эммм))
как бы не совсем понятно зачем проверять пароль на каждый запрос если мы уже его проверили и на основании этого создали сессию
ведь пароль лежит уже в сессии(или в куке что гораздо хуже) и другим оказаться не может))
 
 Top
Vinyl
Отправлено: 18 Августа, 2013 - 22:38:33
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Ну в куке у меня токен, а не пароль и даже не его хэш.

LIME пишет:
зачем проверять пароль на каждый запрос если мы уже его проверили и на основании этого создали сессию


0. Сессии не люблю
1. Сессию подменить проще, чем запись в БД (особенно на хостингах)
2. Вдруг я его снесу, а он будет залогинен до истечения времени сессии.

Люблю полный контроль над ситуацией

(Отредактировано автором: 18 Августа, 2013 - 22:38:55)



-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 23:06:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Ну вот примерно так хочу сделать (сильно упрощенно - это пример)

PHP:
скопировать код в буфер обмена
  1. /*
  2.  * Содержимое user.ini
  3.  * name = vova
  4.  * password = 1234
  5.  *
  6.  */
  7.  
  8. $session = session_start();
  9.  
  10. class Users{
  11.         public $name = null;
  12.         public $password = null;
  13.         private $uid = null;
  14.        
  15.         private function __construct($name, $password){
  16.                 $this->name = $name;
  17.                 $this->password = $password;
  18.                 $this->uid = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'] . $name);
  19.         }
  20.        
  21.         static function check(){
  22.                 if($_SESSION['user']->uid && $_SESSION['user']->uid == md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'] . $_SESSION['user']->name)){
  23.                         $user = new Users($_SESSION['user']->name, $_SESSION['user']->password);
  24.                         return $user;
  25.                 }else{
  26.                         return false;
  27.                 }
  28.         }
  29.        
  30.         static function auth($name = null, $password = null){
  31.                 if(($name && $password) && ($name != '' && $password != '')){
  32.                         $user_data = parse_ini_file('user.ini');
  33.                         if($user_data['name'] == $name && $user_data['password'] == $password){
  34.                                 $user = new Users($name, $password);
  35.                                 $_SESSION['user'] = $user;
  36.                                 header('Location: ');
  37.                         }
  38.                 }else{
  39.                         $user = self::check();
  40.                         if($user){
  41.                                 return $user;
  42.                         }else{
  43.                                 return false;
  44.                         }
  45.                 }
  46.         }
  47. }
  48.  
  49. if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['name']) && isset($_POST['password'])){
  50.         Users::auth($_POST['name'], $_POST['password']);
  51. }else{
  52.         $user = Users::auth();
  53. }
  54.  
  55. echo $user->name ."<br>"; //vova
  56. echo $user->password ."<br>"; //1234
  57. echo $user->uid; //Fatal error: Cannot access private property Users::$uid


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


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DelphinPRO
Отправлено: 18 Августа, 2013 - 23:30:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Vinyl пишет:
0. Сессии не люблю

как говорится, - это ваши личные проблемы Улыбка
Vinyl пишет:
Сессию подменить проще, чем запись в БД (особенно на хостингах)

Ну не так уж и просто ее подменить, не нагнетайте..
Vinyl пишет:
2. Вдруг я его снесу, а он будет залогинен до истечения времени сессии.

Для это давно придуманы различные механизмы\алгоритмы, не проблема вообще.

Также придеживаюсь мнения, что незачем лезть лишний раз базу, когда и так понятно кто перед нами..


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Саныч Модератор
Отправлено: 18 Августа, 2013 - 23:35:32
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




DelphinPRO пишет:
Для это давно придуманы различные механизмы\алгоритмы, не проблема вообще.
Можно пару слов подробнее по этому поводу?


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Страниц (6): « 1 [2] 3 4 5 6 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB