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 :: mysqli запрос - SOS

 PHP.SU

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


 Страниц (1): [1]   

> Описание: скрипт регистрации - авторизации
Rostovsky
Отправлено: 08 Апреля, 2017 - 22:42:18
Post Id


Новичок


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


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




Здравствуйте ребята!

Вопрос мне кажется простой но я с ним залип..

Пишу скрипт регистрации пользователей, и споткнулся на таком вот вопросе - скрипт имеет функцию восстановления пароля через ссылку на почту (?email=$email&password=$password). Ссылочка летит в почту, переход осуществляется тоже исправно но соль в том что при переходе можно поменять пароль к любому логину. Как я вижу - нужно вытащить GET пароль и сделать запрос к базе, в одной из проверок сравнить логин и старый пароль а потом обновить новым паролем. В общем у меня не чего не получается)) подскажите плиз если не понятно объяснил могу код показать..
 
 Top
Мелкий Супермодератор
Отправлено: 08 Апреля, 2017 - 23:28:17
Post Id



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


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


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




Всё неправильно. Восстановление пароля делается так:
0) с формы запроса восстановления ловите данные, по которым будете восстанавливать. Капча или чего-нибудь другое, чтобы не беспокоить пользователя зря от активности ботов. Ищете в СУБД, что такое у вас реально есть.
1) дёргаете random_bytes желаемой длины. Например, 16 байт криптографического мусора вполне достаточно при сохранении урла вменяемой длины. Для старых версий PHP
2) сохраняете полученный токен в какое-нибудь временное хранилище с соответствием user_id и датой генерации токена. редис, мемкеш, можно и в РСУБД.
3) на почту отправляете ссылку с этом токеном. base64, base_convert, или тупой binhex для нормальной передачи бинарного токена.
4) ловите переход с этим токеном. Ищете токен среди выданных ранее, проверяете дату его генерации. Допустимый лимит жизни токена обязан быть ограничен небольшой величиной, например в полчаса-час.
Токена нет/протух - отлуп.
5) токен в норме - даёте форму смены пароля. В hidden-поле передаёте этот же токен, либо генерируете новый на сессию.
6) получение формы смены пароля: проверяете токен с сессионным через timing-safe функцию hash_equals. Если ок, и токен ещё не протух - меняете пароль в базе на новый, авторизуете пользователя, логируете смену пароля через восстановление, удаляете или архивируете выданный токен. Токен обязан быть одноразовым.

Сверху помазать каким-нибудь разумным ограничением на количество запросов в единицу времени для затруднения попыток брутфорса.


-----
PostgreSQL DBA
 
 Top
Rostovsky
Отправлено: 09 Апреля, 2017 - 10:29:05
Post Id


Новичок


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


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




Мелкий пишет:
Всё неправильно. Восстановление пароля делается так:
0) с формы запроса восстановления ловите данные, по которым будете восстанавливать. Капча или чего-нибудь другое, чтобы не беспокоить пользователя зря от активности ботов. Ищете в СУБД, что такое у вас реально есть.
1) дёргаете random_bytes желаемой длины. Например, 16 байт криптографического мусора вполне достаточно при сохранении урла вменяемой длины. Для старых версий PHP
2) сохраняете полученный токен в какое-нибудь временное хранилище с соответствием user_id и датой генерации токена. редис, мемкеш, можно и в РСУБД.
3) на почту отправляете ссылку с этом токеном. base64, base_convert, или тупой binhex для нормальной передачи бинарного токена.
4) ловите переход с этим токеном. Ищете токен среди выданных ранее, проверяете дату его генерации. Допустимый лимит жизни токена обязан быть ограничен небольшой величиной, например в полчаса-час.
Токена нет/протух - отлуп.
5) токен в норме - даёте форму смены пароля. В hidden-поле передаёте этот же токен, либо генерируете новый на сессию.
6) получение формы смены пароля: проверяете токен с сессионным через timing-safe функцию hash_equals. Если ок, и токен ещё не протух - меняете пароль в базе на новый, авторизуете пользователя, логируете смену пароля через восстановление, удаляете или архивируете выданный токен. Токен обязан быть одноразовым.

Сверху помазать каким-нибудь разумным ограничением на количество запросов в единицу времени для затруднения попыток брутфорса.


Спасибо за развернутый ответ буду разбираться!)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB