Я создаю веб-сайт PHP, на котором пользователи регистрируются, и мне интересно узнать о лучших практиках для кодов «подтверждения по электронной почте».
Новые пользователи должны подтвердить свои адреса электронной почты — я делаю это, генерируя код и отправляя его пользователю по электронной почте, который он затем может использовать для активации своей учетной записи. Вместо того, чтобы хранить этот ключ в базе данных, я использую небольшой удобный обходной путь: код является результатом:
md5("xxxxxxxxx".$username."xxxxxxxxxxx".$timestamp."xxxxxxxxx");
Где $timestamp относится к времени создания пользователя. В целом меня это вполне устроило, но потом я задумался, достаточно ли это безопасно? А как насчет возможности столкновений? И мне также нужно сгенерировать коды для сброса пароля и т. д. Если бы я использовал подобную методологию, конфликт мог бы привести к тому, что один пользователь непреднамеренно сбросил бы пароль другого пользователя. И это нехорошо.
Итак, как вы делаете эти вещи? В моих мыслях была таблица следующего формата:
codePK (int, a-I), userID (int), type (int), code (varchar 32), date (timestamp)
Где «тип» будет 1, 2 или 3, что означает «активация», «изменение электронной почты» или «сброс пароля». Это хороший способ сделать это? У вас есть лучший способ?
Используя метод, аналогичный описанному выше, могу ли я автоматически удалить все, что старше двух дней, без использования cron-заданий? Мой хост (почти freespeech.net) их не поддерживает. Если это вообще возможно, я бы хотел избежать cron-job на внешнем хосте, который wget является скриптом, который удаляет вещи, так как это просто беспорядок =P.
Спасибо!
Мала
Обновление:
Для уточнения: я понял, что единственный способ безопасно и безопасно выполнить эту задачу — использовать базу данных, чего старалась избежать исходная функция. Мой вопрос о том, как должна быть структурирована таблица (или таблицы?). Кто-то предложил мне отказаться от codePK и просто сделать код PK. Короче говоря, мой вопрос: это то, что вы делаете?