Всем привет, уже сделал регистрацию, но появились сомнения по поводу такого: Есть таблица users с полями(user_id, user_email, user_password, user_hash) Так вот что я хочу узнать: У меня получается когда пользователь регистрируется в базу я записываю зашифрованный пароль, использую функцию password_hash(функция эта создает хеш пароля, и соль для пароля) выглядит у меня код который шифрует пароль так: PHP: $password = password_hash($_POST['password'], PASSWORD_DEFAULT); А вот теперь к сути вопроса это ВАЖНО: У меня есть еще поле user_hash все подумают что это хеш пароля, но это не так. Поле предназначено для того что генерирует строку, которая после регистрации вставляется в ссылку, и отправляется вместе с письмом этому пользователю на email. Если он перешел по этой ссылке, с этим user_hash который с генерировался для него то считаем что пользователь зарегистрировался на сайте, если не перешел то он не считается пользователем сайта. Думаю суть понятна вам: И сам вопрос звучит так: мне стоит хранить эту строку которая с регенерирована для этого пользователя в базе, если она не будет использоваться по сути. Одним словом она нужна для активации. Подскажите стоит ли ее удалять при активации аккаунта? Жду ваших хороших предположений и правильных ответов, как бы вы поступили.
Ну я бы перезаписал на пустую, да. --- Добавлено --- И назвал бы как-нибудь ближе к делю. Типа email_check_key
что это, друг? --- Добавлено --- тебе удалось ввести меня в заблуждение. возможно через полгода тебе удастся самого себя ввести в заблуждение. Названия полей должны говорить сами за себя. И желательно добавлять к ним комментарии. отдельную таблицу заведи для активаций и подтверждений разного типа. Например это ещё используется при восстановлении пароля. --- Добавлено --- одноразовые рандомные идентификаторы для мыла нужно удалять, да. если они тебе больше никогда не понадобятся, то нахрена их хранить?
@mkramer @igordata Ну да user_hash переменную а разница между названиями, и все а принцип один и тот же. У меня есть отдельная таблица restore поля в ней (id, email, hash, time) Как по названию ясно что это восстановления пароля. При попытке восстановить надо указать email, далее я делаю проверку, что пользователь есть, если есть отправляю hash и ссылку для активации в письме. А вот на счет регистрации такую же фигню сделать, отдельную таблицу предлагаете сделать? И как оно будет выглядеть, какие поля нужны будут (id, user_check, time). Хотелось бы чтобы заявки зарегистрированных не валялись просто так, если пользователь не активировал аккаунт свой, удалялась заявка регистрации. И из таблицы users и из таблицы которую я создам для подтверждения аккаунта. Я не пойму, объясните пожалуйста.
удали столбец user_hash и создай таблицу для временных записей, где будет указываться хеш, json код ( все данные введенные при регистрации) и если юзер в течении некоторого времени успел перейти по ссылке из почты, то json данные переправляются в столбец юзеров зарегистрированных, иначе временная запись делете и уведомляем о просрочке Это хороший вариант, чтобы не захламлять рег таблицу.
@MouseZver Не понял, не много вот например, у меня при регистрации надо указать такое, при регистрации: PHP: $sql = 'INSERT INTO `users` (`user_login`, `user_email`, `user_password`, `user_reg_date`, `user_active_hash`, `user_role`) VALUES (:user_login, :user_email, :user_password, NOW(), :user_active_hash, 3)'; А как же создать таблицу, ну например таблица chackUser(какие тут поля указывать все что в этом запросе?) Просто не пойму зачем все поля указывать, если и так удалится будут данные из 2х таблиц, если пользователь не активирует аккаунт. Запутался) Подправь меня)
Короче будет три поля, в новой таблице а именно (id, user_check_email, time, на счет емаил добавить фиг его) если он подтвердить ссылку, значит регаем если нету удаляем данные из таблицы users и из таблицы checkuser. Норма парни так, чтобы не засорять, таблицу. Просто почитал не много про json это типа того он формирует массив из строк текстовых. И как то там обрабатывает ну короче буду с ним парится еще долго)
разница? прочел - понял прочел - не понял есть разница? --- Добавлено --- в остальном ты вроде всё правильно понял
@igordata А на счет поле email в таблицу ckeckuser добавлять, как думаешь? просто будет видно что за email делает регистрацию, Если user_hash поле поменять на email_check_activation то принцип не поменяется, имел введу я))) Ну я создал уже отдельную таблицу, дальше буду разбираться с ней, и с регистрацией, как оно выглядеть будет и т. д.
@igordata Хорошо, а что не понравится должно, все хорошо. Вот еще подскажите, hash создавать из 32 символов или из 60, для подтверждение email? Просто я знаю можно и больше даже hash задать, по желанию короче) Как бы вы сделали, генерацию hash? Я например так: $hash = md5(uniqid(rand(), true));
сделай 120 если тебе так спокойнее =) чего ты паришься? Это всё равно ссылка. Руками ж не вводить. base64_encode(random_bytes(40))
@igordata Спасибо) Попробую) Не получилось, ругается на random_bytes но не суть. Помогите мне проверку сделать на время, что время окончено ссылка не действительна. Вообще запрос на проверку hash и активации идет так: PHP: //Производим активацию аккаунта if(isset($_GET['key'])){ //Проверяем ключ $stmt = $pdo->prepare("SELECT * FROM `userscheck` WHERE `email_check_activation` = :key"); $stmt->bindValue(':key', $_GET['key'], PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if(count($rows) == 0) $err[] = 'Ключ активации не верен!'; if(count($err) > 0) echo showErrorMessage($err); else{ //Получаем адрес пользователя $email = $rows[0]['user_email']; //Активируем аккаунт пользователя $sql = 'UPDATE `users` SET `user_activation` = 1 WHERE `user_email` = :user_email'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':user_email', $email, PDO::PARAM_STR); $stmt->execute(); //Отправляем письмо об успешной активации $title = 'Ваш аккаунт успешно активирован'; $message = 'Поздравляем ваш аккаунт успешно активирован'; sendMessageMail($email, $mail_autor, $title, $message); echo "<script>document.location.replace('?go=register&active=ok');</script>"; } } А время как добавить ограничения? И у меня активация не проходит почему то( что надо подправить?
@igordata Я со временем не работал, как мне проверить подскажи пожалуйста, да и активация не проходит, в базу я записываю hash значение а активация не хочет проходить в таблице users.
я не скажу как хочу чтобы ты почитал сам и решил, какой способ тебе подходит больше. А то я скажу - и ты будешь только им и пользоваться. Почитай.
Ок хорошо, а почему активация не проходить? при регистрации я делаю вот такой запрос и записываю данные в 2 таблицы: PHP: Вот тут идут всякие проверки на ввод данных //Создаем уникальную строку, для активации пользователя $email_check_activation = RandomToken(); //переменная для работы с временем $time = time(); //Солим созданный пароль пользователя $password = password_hash($_POST['password'], PASSWORD_DEFAULT); /*Если все хорошо, пишем данные в базу*/ $reg = $pdo->prepare("INSERT INTO `users` (`user_login`, `user_email`, `user_password`, `user_reg_date`, `user_role`) VALUES (:user_login, :user_email, :user_password, NOW(), 3)"); $reg->bindValue(':user_login', $_POST['login'], PDO::PARAM_STR); $reg->bindValue(':user_email', $_POST['email'], PDO::PARAM_STR); $reg->bindValue(':user_password', $password, PDO::PARAM_STR); if($reg->execute()){ /*Вставляем в базу строку для активации акаунта*/ $activation = $pdo->prepare("INSERT INTO `userscheck` SET `email` = '".$email."', `email_check_activation` = '".$email_check_activation."', `time` = '".$time."'"); $activation->execute(); Ниже этой строки отправляем письмо для активации И сам код который делает и проверяет активацию написал выше. --- Добавлено --- @igordata Где у меня ошибка, не пойму, Или что то не дописал, помогите пожалуйста.
дебагай. я не смогу ща вчитаться. попробуй выводить переменные по мере выполнения скрипта. посмотри где тчо не так
@igordata Понимаешь запись в таблицу userscheck и в таблицу users происходить после нажатия кнопки регистрация. И письмо отправляется, а вот когда перехожу по письму, пишет активировано, но статус не меняется на 1, а остается 0. Не пойму, честно. Ну присмотрись пожалуйста. Я вроде доступно написал.
@igordata Пробовал сделать так: PHP: if(isset($_GET['key'])){ //Проверяем ключ $stmt = $pdo->prepare("SELECT * FROM `userscheck` WHERE `email_check_activation` = :key"); $stmt->bindValue(':key', $_GET['key'], PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if(count($rows) == 0){ $err[] = 'Ключ активации не верен!'; if ($rows < 0) { $time - time(); $num = 30; //здесь задаешь срок жизни ссылки в секундах if(($time - $rows['time']) < $num) { echo 'Введите новый пароль!'; } else { echo 'Ссылка просрочена!'; } } }else{ echo 'activation_ok'; } Но не чего не получилось( проверить ссылку по времени, помогите пожалуйста.
@mkramer Да я вообще, на пару секунд специально сделал, проверить хотел вообще. Помогите пожалуйста. Что я не так делаю?