За последние 24 часа нас посетили 17336 программистов и 1264 робота. Сейчас ищут 1527 программистов ...

Система друзей и ее реализация php mysql

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

  1. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Так пойдёт, только дезактивируй её пока по новой её не запросят и генерируй при запросе новую сразу, её и отправляй на почту, чтобы не подобрали, хотя это не реально (если 32 символа с a-z0-9).
    Но по безопасности в теории может быть брешь, что если базу вскроют, то смогут пользоваться этой строкой чтобы получить доступ к аккаунту не имея доступа к почте
    --- Добавлено ---
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    Вот у них будет эта строка, а толку от нее, если эта строка приходит на почту которую указал пользователь, а он же не может зайти на его почту надо же пароль знать, как ни как.
     
  3. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    перестраховка. если базу украдут
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Какую лучше функцию использовать? Для генерации случайных чисел?
    Вот например нашел в инете, вроде хорошая:
    PHP:
    1. function getRandString($num){
    2.         //Генерим массив из букв
    3.         $letter = range('a', 'z');
    4.         //Генерим массив из цифр
    5.         $number = range(0, 9);
    6.  
    7.         //Создаем строку с маленькими и большими буквами и цифрами
    8.         $letter = implode('',$letter);
    9.         $letter = $letter.strtoupper($letter).implode('',$number);
    10.  
    11.         //Строка с генерированым паролем
    12.         $randStr = '';
    13.         for ($i = 0; $i < $num; $i++){
    14.             //Прогоняем циклом столько, сколько нужно символов в строке
    15.             $randStr .= $letter[rand(0, strlen($letter) - 1)];
    16.         }
    17.         return $randStr;
    18.     }
    19.  
    20. $active_hash = getRandString(8);
    21. $pass = md5(md5(getRandString(10)).md5($salt));
    Оцени подойдет для генерации этой строки, для каждого пользователя?
    --- Добавлено ---
    @denis01
    Ок допустим украли базу, а дальше что они с этими полями будут делать, пароль зашифрован, а поле с генерируемой строкой нужно для подтверждения регистрации и все.
    Куда копать будут они)))
     
  5. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    https://secure.php.net/manual/ru/function.random-bytes.php

    Если при запросе восстановления пароля будешь менять эту строку и помечать при её использовании, что она не действительна, тогда проблем не будет
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    13 страниц! И @denis01 до сих пор не бомбануло. Я восхищаюсь спокойствием этого человека.
     
    acho и denis01 нравится это.
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    У кого с нервами проблема тому в эту тему нельзя заходить)
    --- Добавлено ---
    Ну помечать буду что она уже была использована)
    А вот только дезактивируй её пока по новой её не запросят и генерируй при запросе новую сразу
    Что это такое?
     
  8. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Вот у тебя есть эта строка в базе, написано, что уже использована, это хорошо.
    Когда кто-то запросит восстановить пароль, ты эту старую меняй на новую и помечай что её не использовали.
    --- Добавлено ---
    Это же интернет, тут вообще нет смысла возмущаться, что-то не нравиться, можно игнорировать :)
     
    romach нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    Взял первую функцию с сайта) Уже подключил проверил значения разные записывает))) Это хорошо.
    Денис послушай:
    А если например, я не помечаю что она использовалась, а просто по ней пользователь будет проходить на новый пароль, а когда он сменит его то генерить новую строку, будет ли это правильно?
    Мне кажется вроде норм)))
    Хотя я начинающий кто его может знать)
     
  10. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    хэш пароля, строка для активации и строка для восстановления пароля это три разные строки
    --- Добавлено ---
    @_ne_scaju_ пользователь запросил новый пароль, генерируешь строку, помечаешь что она не использована, пишешь что она действительно 24 часа, на почту отправляешь эту строку.
    Как пользователь восстановил пароль, то пишешь в базу новый хэш пароля (на основе нового пароля что ввёл пользователь), помечаешь строку как уже использованную.
    хэш пароля и строка для активации и восстановления пароля это три разные строки
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    Ок...
    Хеш пароля это и есть пароль
    Строка для активации с генерируемая строка
    Восстановления пароля НоВая стока ПОЧЕМУ, если можно использовать строку для генерируемую?
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    А как указать запрос для активации что бы по таймеру была активация, я еще такие запросы не делал)

    Вот еще вопрос, а как же между 2-мя формами в одном файле с php обработчиком для этих форм сделать переход?
    То-есть одна форма видна другую закрываем? Потом когда отработал скрипт, открываем вторую, а первую закрываем.
    Пробую сделать так но открывается не та форма что надо( и после отработанного кода открывается та же форма что и первая(
    PHP:
    1. <?php if($_GET['recovery']){ ?>
    2. <!-- форма востановления пароля введите E-mail -->
    3. <?php }else{ ?>
    4. <!-- форма восстановления пароля -->
    5. <?php } ?>
     
    #312 _ne_scaju_, 5 апр 2017
    Последнее редактирование: 5 апр 2017
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Короче не стал парится 20 минут еще посидел, и подумал разделю эти 2 формы на 2 файла и в них обработчики напишу)
    Все получилось вроде как, завтра протестирую еще и отпишусь, если конечно кого то интересует.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    И в итоге довольно не плохо получилось восстановления пароля, взял готовый пример, разобрался как он работает, пару запросов в нем, было.
    Сделал проверку этой строки с генерируемой:
    PHP:
    1. //Тут идет запрос на проверку этой строки
    2. if(count('key') == 0){
    3. erorr[] = 'Эта ссылка устарела';
    4. //Делаем редирект на то место от куда пришел)
    5. }else{
    6. Все хорошо меняем пароль выводим вторую форму)))
    7. }
    А вот как можно еще добавить такое, вот например он перешел по ссылке она например получилась такая:
    http://site.ru?new&key=jsdflajdflaj
    И когда он хочет изменить эту строку например убрать одну букву или что еще: сразу редиректом его перенаправляем на страницу от куда пришел?
    Или хватит того что если он переходит по старой ссылке, или меняет пароль то мы сообщаем что ссылка не действительна и редиректом перенаправляем, или джава скриптом)

    Только вот что а если он перешел по ссылке правильной, и потом стер букву специально без обновления страницы, и старается изменить пароль, то ему напишет что он изменил пароль, но на самом деле пароль в базе не поменяется, и-за того что стерта буква или цифра, просто уже тестировал и проверял.

    Если перешел по правильной ссылке, открываю форму где нужно менять пароль, и меняю в ссылке букву или цифру, и не обновляю страницу.
    Дальше пишу новый пароль, ему пишу что он поменял пароль, но в базе пароль не меняется и-за удаления или изменения ссылки.

    КАК ЕГО ПРЕДУПРЕДИТЬ из-за изменения ссылки ваш пароль не изменился? где прикрутить эту проверку? Или как узнать что он изменил ссылку, без перезагрузки страницы?

    Ну все жду ваших ответов, спасибо.
     
  15. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    перед тем как меняешь пароль пользователю ты должен проверить его ключ для смены пароля, этот ключ передавай вместе с новым паролем, так ты сможешь опять проверить ключ перед изменением пароля.

    добавь ещё email пользователя, чтобы нельзя было просто перебирать ключ, а нужно было ещё и email указывать, так сложнее подобрать

    в базу запиши время когда запросили восстановление пароля, потом когда проверяешь ключ, то посмотри через SQL не прошло ли время, там простой запрос больше меньше, берёшь время из базы и прибавляешь 24 часа (SQL работы с временем) если оно больше времени из базы, то ещё не прошло 24 часа
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    Первое, когда я нажимаю изменить пароль открывается форма для ввода емаил
    Второе я ввожу емаил и делаю проверку, если емаил есть, то отправляю письмо с этим ключем что в базе есть.
    Третье он переходит по ссылке,
    Четвертое проверяем ссылку если она ложная пишу что ее нет или она была уже использована, а если правильная то открываем вторую форму
    Пятое меняем пароль и заносим в базу новый пароль и новый ключ!!!

    Правильно ли?
    Или проверку ключа этого делать перед открытием второй формы?
    --- Добавлено ---
    @denis01
    в базу запиши время когда запросили восстановление пароля, потом когда проверяешь ключ, то посмотри через SQL не прошло ли время, там простой запрос больше меньше, берёшь время из базы и прибавляешь 24 часа (SQL работы с временем) если оно больше времени из базы, то ещё не прошло 24 часа
    А как можно работать с временем в бд, покажите пожалуйста или дайте ссылку где можно посмотреть, как делать эти запрос.
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    Вы можете мне объяснить для смены пароля нужно использовать:
    Этот код:
    PHP:
    1. $password = password_hash($_POST['pass'], PASSWORD_DEFAULT);
    Или этот:
    PHP:
    1. if (password_needs_rehash($new_password, PASSWORD_DEFAULT, ['cost' => 12])) {
    2.     $new_password = password_hash($_POST['pass'], PASSWORD_DEFAULT, ['cost' => 12]);
    3. }
    Просто я и этот способ и этот пробую и у меня после смена пароля в базе записываются новые значения, а какой способ правильный, если первый способ отвечает за создания хеша пароля, а второй для проверки создания нового хеша или что то в том духе.
     
  18. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    какой работает?
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @denis01
    Работают 2 проверил )
    А какой правильный, я не знаю.
     
  20. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    1. Используется для создания хэша пароля
    2. Используется при изменении алгоритма создания хэша. Что бы перехешировать пароли пользователей во время аутентификации.
     
    denis01 нравится это.
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @romach
    1. способ можно использовать что бы создать новый хеш?
    2. способ я так понял не обязателен, для изменения пароля и он не подходит?
     
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    можно ли использовать способ "для создания хэша" для создания хэша? А хер его знает...
     
  23. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    скорее нет, чем да. :D
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @TeslaFeo
    @romach
    Так вы за какой способ ведете речь?
    Я же написал и первый и второй при изменении пароля меняю в таблице хеш пароля.
    А какой правильный, не знаю я оставил 1-вый способ)
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Народ кто подскажет как проверить сессию она есть в данный момент или нет. Ну например, когда я вошел на сайт.
    А то я делаю вход, если нажму на главную, у и потом опять на вход мне надо опять вводить данные для входа.
    Я фиг его знаю как его оставить в сессии если он ее не уничтожил, и не нажал на выход.