За последние 24 часа нас посетили 34844 программиста и 1697 роботов. Сейчас ищут 685 программистов ...

Восстановление пароля - только код сброса или еще и имейл?

Тема в разделе "PHP для новичков", создана пользователем bocharsky, 8 дек 2014.

  1. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Делаю функционал сброса/восстановления пароля.
    Базовая логика понятна, есть вопросы по нюансам.
    Базовая логика:
    1. Пользователь нажимает на ссылку "Забыл пароль"
    2. Попадает на страницу /forgot с формой для ввода имейл.
    3. Вводит имейл, нажимает кнопку Отправить.
    На сервере создается уникальный код abc123 и формируется ссылка вида /forgot?forgot_key = abc123.
    Ссылка высылается на введенный имейл.
    Код записываем в базу данных. [ВОПРОС: С ИМЕЙЛОМ ИЛИ БЕЗ?]
    4. Пользователь идет в свой почтовый ящик, видит там ссылку на сброс пароля /forgot?forgot_key = abc123. Нажимает ссылку.
    5. И ВОТ ТУТ ВОПРОС:
    Как положено проводить проверку верификационного кода? Просто посмотреть в БД, есть ли там такое? Или проверять пару "код - имейл"? Т.е. при записи кода писать в БД еще и имейл.
    Но тогда надо этот имейл очевидно включать и параметром в ссылку, типа /forgot?forgot_key = abc123&email=email@site.com

    И вот я пытаюсь сообразить, важно это или нет?
    Дает ли какие-то преимущества, защиту использование пары код-имей. Или нет?

    Посмотрел несколько крупных сервисов, там просто передается код.
    Например, у Dropbox это https://www.dropbox.com/l/ql2Z1Gt23lULSZaLfG7oTD/forgot
    Но могу предположить, что у них это может быть зашифрованной строкой, включающей имейл и код, который они затем расшифровывают.

    Поэтому,
    А.) чтобы не ломать голову, решил просто спросить у уважаемых коллег: "Как принято?".

    Б.) Да, и еще надо реализовать срок жизни ссылки/кода. Это видимо делается записью в БД таймстемпа создания кода, а при обращении к нему проверкой не прошло ли скажем 12*60*60 секунд.
    Так?

    Спасибо!
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Восстановление пароля - только код сброса или еще и имей

    как принято - личное дело каждого. но чаще всего берут самое рациональное решение. смотрите:
    в таблице юзеров есть уник юзера, прально? делаем либо отдельную таблицу действий в которые будем складировать разные действия привязанные к рандомным идентификаторам в ссылках, либо создаем два поля в таблице юзеров - код сброса пароля и дата генерации кода.
    далее пожалуй именно второй вариант рассмотрим.
    пользователь нажал "забыл пароль", ввел почту - по ней в базе нашли строку пользователя, записали строку и её дату, отправили письмо.
    пользователь получил письмо, открыл ссылку, ищем строку и проверяем дату. если строка есть и не протухла - запоминаем идентификатор пользователя, показывая форму ввода нового пароля. юзер вбивает новый пароль, жмет отправить, мы опять по коду находим строку пользователя, обновляем ему пароль и чистим строку-дату. всё.
    юзер трижды жамкнул "проблемы с памятью" - трижды создали строку, трижды отправили письмо. не сложно догадаться что работать будет только строка которую записали самой последней. письмо отправили голубиной почтой? ну тут строка протухнет пока получатель дождется птиц. безопасность? если у злодея есть доступ к почте жертвы то какая тут безопасность? в остальном вполне себе простое и достаточно безопасное решение.
     
  3. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Восстановление пароля - только код сброса или еще и имей

    Огромное спасибо! Теперь все встало на свои места! )))

    Добавлено спустя 38 минут 47 секунд:
    Re: Восстановление пароля - только код сброса или еще и имейл?
    ...только все же хочу на всякий случай уточнить. Это собственно и есть мои первичные сомнения, которые нуждались в пояснении.

    Рассмотрим этап, когда пользователь уже получил ссылку, нажал на нее. Мы отловили из ссылки методом GET наш код-идентификатор и пошли искать его в базе.
    А вот теперь вопрос: мы просто ищем факт наличия этого кода, без привязки к юзеру? В таблице 100 тыс строк, для тысячи записаны актуальные в ближайшие 12 часов коды. И мы просто ищем совпадение. Так?

    Или все-таки мы ищем совпадение для пары код/юзер?
    Т.е. можно сделать
    Код (Text):
    1. SELECT forgotten_code FROM User
    А можно
    Код (Text):
    1. SELECT forgotten_code FROM User WHERE email = '$email'
    Для второго случая можно в ссылке и имейл передать.

    Или это не имеет смысла? И просто поиск кода в таблице и факт его наличия достаточен?

    И еще мелкий вопрос:
    а как лучше искать строку в таблице. Через Like
    Код (Text):
    1. SELECT forgotten_code FROM User WHERE forgotten_code LIKE '$forgotten_code'
    или извлечь все, переколбасить в массив с помощью fetch_array и искать в массиве?
    Второй вариант кажется громоздким - все извлекать и обрабатывать. Но и на Like много ругаются вроде бы за медленность.

    Спасибо!
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Восстановление пароля - только код сброса или еще и имей

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

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Восстановление пароля - только код сброса или еще и имей

    И еще раз спасибо!