За последние 24 часа нас посетил 22221 программист и 1173 робота. Сейчас ищут 738 программистов ...

Деликатный вопрос, на счет скрипта, регистрация php mysql

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 24 апр 2017.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем привет, уже сделал регистрацию, но появились сомнения по поводу такого:
    Есть таблица users с полями(user_id, user_email, user_password, user_hash)
    Так вот что я хочу узнать:
    У меня получается когда пользователь регистрируется в базу я записываю зашифрованный пароль, использую функцию password_hash(функция эта создает хеш пароля, и соль для пароля) выглядит у меня код который шифрует пароль так:
    PHP:
    1. $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
    А вот теперь к сути вопроса это ВАЖНО:
    У меня есть еще поле user_hash все подумают что это хеш пароля, но это не так. Поле предназначено для того что генерирует строку, которая после регистрации вставляется в ссылку, и отправляется вместе с письмом этому пользователю на email.
    Если он перешел по этой ссылке, с этим user_hash который с генерировался для него то считаем что пользователь зарегистрировался на сайте, если не перешел то он не считается пользователем сайта.

    Думаю суть понятна вам: И сам вопрос звучит так:
    мне стоит хранить эту строку которая с регенерирована для этого пользователя в базе, если она не будет использоваться по сути.
    Одним словом она нужна для активации. Подскажите стоит ли ее удалять при активации аккаунта?
    Жду ваших хороших предположений и правильных ответов, как бы вы поступили.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну я бы перезаписал на пустую, да.
    --- Добавлено ---
    И назвал бы как-нибудь ближе к делю. Типа email_check_key
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    что это, друг?
    --- Добавлено ---
    тебе удалось ввести меня в заблуждение. возможно через полгода тебе удастся самого себя ввести в заблуждение. Названия полей должны говорить сами за себя. И желательно добавлять к ним комментарии.

    отдельную таблицу заведи для активаций и подтверждений разного типа. Например это ещё используется при восстановлении пароля.
    --- Добавлено ---
    одноразовые рандомные идентификаторы для мыла нужно удалять, да. если они тебе больше никогда не понадобятся, то нахрена их хранить?
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    @igordata
    Ну да user_hash переменную а разница между названиями, и все а принцип один и тот же.
    У меня есть отдельная таблица restore поля в ней (id, email, hash, time)
    Как по названию ясно что это восстановления пароля. При попытке восстановить надо указать email, далее я делаю проверку, что пользователь есть, если есть отправляю hash и ссылку для активации в письме.
    А вот на счет регистрации такую же фигню сделать, отдельную таблицу предлагаете сделать?
    И как оно будет выглядеть, какие поля нужны будут (id, user_check, time).
    Хотелось бы чтобы заявки зарегистрированных не валялись просто так, если пользователь не активировал аккаунт свой, удалялась заявка регистрации. И из таблицы users и из таблицы которую я создам для подтверждения аккаунта.
    Я не пойму, объясните пожалуйста.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    удали столбец user_hash и создай таблицу для временных записей, где будет указываться хеш, json код ( все данные введенные при регистрации)
    и если юзер в течении некоторого времени успел перейти по ссылке из почты, то json данные переправляются в столбец юзеров зарегистрированных, иначе временная запись делете и уведомляем о просрочке
    Это хороший вариант, чтобы не захламлять рег таблицу.
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    Не понял, не много вот например, у меня при регистрации надо указать такое, при регистрации:
    PHP:
    1.  $sql = 'INSERT INTO `users`
    2. (`user_login`, `user_email`, `user_password`, `user_reg_date`, `user_active_hash`, `user_role`)
    3. VALUES
    4. (:user_login, :user_email, :user_password, NOW(), :user_active_hash, 3)';
    А как же создать таблицу, ну например таблица chackUser(какие тут поля указывать все что в этом запросе?)
    Просто не пойму зачем все поля указывать, если и так удалится будут данные из 2х таблиц, если пользователь не активирует аккаунт.
    Запутался) Подправь меня)
     
    #6 _ne_scaju_, 24 апр 2017
    Последнее редактирование: 24 апр 2017
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    checkuser ( hash, json, time )
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    json это - функция или просто обычное поле в таблице checkuser?
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Короче будет три поля, в новой таблице а именно (id, user_check_email, time, на счет емаил добавить фиг его) если он подтвердить ссылку, значит регаем если нету удаляем данные из таблицы users и из таблицы checkuser. Норма парни так, чтобы не засорять, таблицу.
    Просто почитал не много про json это типа того он формирует массив из строк текстовых. И как то там обрабатывает ну короче буду с ним парится еще долго)
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    разница?
    прочел - понял
    прочел - не понял
    есть разница?
    --- Добавлено ---
    в остальном ты вроде всё правильно понял
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    А на счет поле email в таблицу ckeckuser добавлять, как думаешь?
    просто будет видно что за email делает регистрацию,
    Если user_hash поле поменять на email_check_activation то принцип не поменяется, имел введу я)))
    Ну я создал уже отдельную таблицу, дальше буду разбираться с ней, и с регистрацией, как оно выглядеть будет и т. д.
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    да добавь. не понравится - уберёшь.
     
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Хорошо, а что не понравится должно, все хорошо.
    Вот еще подскажите, hash создавать из 32 символов или из 60, для подтверждение email?
    Просто я знаю можно и больше даже hash задать, по желанию короче)
    Как бы вы сделали, генерацию hash?
    Я например так: $hash = md5(uniqid(rand(), true));
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    сделай 120 если тебе так спокойнее =) чего ты паришься? Это всё равно ссылка. Руками ж не вводить.

    base64_encode(random_bytes(40))
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Спасибо) Попробую)
    Не получилось, ругается на random_bytes но не суть.
    Помогите мне проверку сделать на время, что время окончено ссылка не действительна.
    Вообще запрос на проверку hash и активации идет так:
    PHP:
    1. //Производим активацию аккаунта
    2. if(isset($_GET['key'])){
    3. //Проверяем ключ
    4. $stmt = $pdo->prepare("SELECT * FROM `userscheck` WHERE `email_check_activation` = :key");
    5. $stmt->bindValue(':key', $_GET['key'], PDO::PARAM_STR);
    6. $stmt->execute();
    7. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    8. if(count($rows) == 0)
    9. $err[] = 'Ключ активации не верен!';
    10.  
    11. if(count($err) > 0)
    12. echo showErrorMessage($err);
    13.  
    14. else{
    15.  
    16. //Получаем адрес пользователя
    17. $email = $rows[0]['user_email'];
    18.  
    19. //Активируем аккаунт пользователя
    20. $sql = 'UPDATE `users` SET `user_activation` = 1 WHERE `user_email` = :user_email';
    21. $stmt = $pdo->prepare($sql);
    22. $stmt->bindValue(':user_email', $email, PDO::PARAM_STR);
    23. $stmt->execute();
    24.  
    25. //Отправляем письмо об успешной активации
    26. $title = 'Ваш аккаунт успешно активирован';
    27. $message = 'Поздравляем ваш аккаунт успешно активирован';
    28. sendMessageMail($email, $mail_autor, $title, $message);
    29. echo "<script>document.location.replace('?go=register&active=ok');</script>";
    30. }
    31. }
    А время как добавить ограничения?
    И у меня активация не проходит почему то( что надо подправить?
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    php старый

    вот после этой строки проверь время не вышло ли
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Я со временем не работал, как мне проверить подскажи пожалуйста, да и активация не проходит, в базу я записываю hash значение а активация не хочет проходить в таблице users.
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я не скажу как
    хочу чтобы ты почитал сам и решил, какой способ тебе подходит больше. А то я скажу - и ты будешь только им и пользоваться. Почитай.
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Ок хорошо, а почему активация не проходить? при регистрации я делаю вот такой запрос и записываю данные в 2 таблицы:
    PHP:
    1. Вот тут идут всякие проверки на ввод данных
    2. //Создаем уникальную строку, для активации пользователя
    3. $email_check_activation = RandomToken();
    4. //переменная для работы с временем
    5. $time = time();
    6. //Солим созданный пароль пользователя
    7. $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
    8.  
    9. /*Если все хорошо, пишем данные в базу*/
    10. $reg = $pdo->prepare("INSERT INTO `users`
    11. (`user_login`, `user_email`, `user_password`, `user_reg_date`, `user_role`)
    12. VALUES
    13. (:user_login, :user_email, :user_password, NOW(), 3)");
    14. $reg->bindValue(':user_login', $_POST['login'], PDO::PARAM_STR);
    15. $reg->bindValue(':user_email', $_POST['email'], PDO::PARAM_STR);
    16. $reg->bindValue(':user_password', $password, PDO::PARAM_STR);
    17. if($reg->execute()){
    18. /*Вставляем в базу строку для активации акаунта*/
    19. $activation = $pdo->prepare("INSERT INTO `userscheck` SET `email` = '".$email."', `email_check_activation` = '".$email_check_activation."', `time` = '".$time."'");
    20. $activation->execute();
    21. Ниже этой строки отправляем письмо для активации
    И сам код который делает и проверяет активацию написал выше.
    --- Добавлено ---
    @igordata
    Где у меня ошибка, не пойму, Или что то не дописал, помогите пожалуйста.
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    дебагай. я не смогу ща вчитаться. попробуй выводить переменные по мере выполнения скрипта. посмотри где тчо не так
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Понимаешь запись в таблицу userscheck и в таблицу users происходить после нажатия кнопки регистрация.
    И письмо отправляется, а вот когда перехожу по письму, пишет активировано, но статус не меняется на 1, а остается 0.
    Не пойму, честно. Ну присмотрись пожалуйста. Я вроде доступно написал.
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Так как правильно сделать? Помогите пожалуйста...
     
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Пробовал сделать так:
    PHP:
    1. if(isset($_GET['key'])){
    2. //Проверяем ключ
    3. $stmt = $pdo->prepare("SELECT * FROM `userscheck` WHERE `email_check_activation` = :key");
    4. $stmt->bindValue(':key', $_GET['key'], PDO::PARAM_STR);
    5. $stmt->execute();
    6. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    7. if(count($rows) == 0){
    8. $err[] = 'Ключ активации не верен!';
    9. if ($rows < 0) {
    10. $time - time();
    11. $num = 30; //здесь задаешь срок жизни ссылки в секундах
    12.      if(($time - $rows['time']) < $num) {
    13.           echo 'Введите новый пароль!';
    14.      }
    15.      else {
    16.           echo 'Ссылка просрочена!';
    17.      }
    18. }
    19. }else{
    20.     echo 'activation_ok';
    21. }
    Но не чего не получилось( проверить ссылку по времени, помогите пожалуйста.
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    30 секунд на открытие ящика, поиск письма и щёлканье по ссылке - сильно :)
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Да я вообще, на пару секунд специально сделал, проверить хотел вообще. Помогите пожалуйста.
    Что я не так делаю?