Так пойдёт, только дезактивируй её пока по новой её не запросят и генерируй при запросе новую сразу, её и отправляй на почту, чтобы не подобрали, хотя это не реально (если 32 символа с a-z0-9). Но по безопасности в теории может быть брешь, что если базу вскроют, то смогут пользоваться этой строкой чтобы получить доступ к аккаунту не имея доступа к почте --- Добавлено ---
@denis01 Вот у них будет эта строка, а толку от нее, если эта строка приходит на почту которую указал пользователь, а он же не может зайти на его почту надо же пароль знать, как ни как.
Какую лучше функцию использовать? Для генерации случайных чисел? Вот например нашел в инете, вроде хорошая: PHP: function getRandString($num){ //Генерим массив из букв $letter = range('a', 'z'); //Генерим массив из цифр $number = range(0, 9); //Создаем строку с маленькими и большими буквами и цифрами $letter = implode('',$letter); $letter = $letter.strtoupper($letter).implode('',$number); //Строка с генерированым паролем $randStr = ''; for ($i = 0; $i < $num; $i++){ //Прогоняем циклом столько, сколько нужно символов в строке $randStr .= $letter[rand(0, strlen($letter) - 1)]; } return $randStr; } $active_hash = getRandString(8); $pass = md5(md5(getRandString(10)).md5($salt)); Оцени подойдет для генерации этой строки, для каждого пользователя? --- Добавлено --- @denis01 Ок допустим украли базу, а дальше что они с этими полями будут делать, пароль зашифрован, а поле с генерируемой строкой нужно для подтверждения регистрации и все. Куда копать будут они)))
https://secure.php.net/manual/ru/function.random-bytes.php Если при запросе восстановления пароля будешь менять эту строку и помечать при её использовании, что она не действительна, тогда проблем не будет
У кого с нервами проблема тому в эту тему нельзя заходить) --- Добавлено --- Ну помечать буду что она уже была использована) А вот только дезактивируй её пока по новой её не запросят и генерируй при запросе новую сразу Что это такое?
Вот у тебя есть эта строка в базе, написано, что уже использована, это хорошо. Когда кто-то запросит восстановить пароль, ты эту старую меняй на новую и помечай что её не использовали. --- Добавлено --- Это же интернет, тут вообще нет смысла возмущаться, что-то не нравиться, можно игнорировать
@denis01 Взял первую функцию с сайта) Уже подключил проверил значения разные записывает))) Это хорошо. Денис послушай: А если например, я не помечаю что она использовалась, а просто по ней пользователь будет проходить на новый пароль, а когда он сменит его то генерить новую строку, будет ли это правильно? Мне кажется вроде норм))) Хотя я начинающий кто его может знать)
хэш пароля, строка для активации и строка для восстановления пароля это три разные строки --- Добавлено --- @_ne_scaju_ пользователь запросил новый пароль, генерируешь строку, помечаешь что она не использована, пишешь что она действительно 24 часа, на почту отправляешь эту строку. Как пользователь восстановил пароль, то пишешь в базу новый хэш пароля (на основе нового пароля что ввёл пользователь), помечаешь строку как уже использованную. хэш пароля и строка для активации и восстановления пароля это три разные строки
@denis01 Ок... Хеш пароля это и есть пароль Строка для активации с генерируемая строка Восстановления пароля НоВая стока ПОЧЕМУ, если можно использовать строку для генерируемую?
@denis01 А как указать запрос для активации что бы по таймеру была активация, я еще такие запросы не делал) Вот еще вопрос, а как же между 2-мя формами в одном файле с php обработчиком для этих форм сделать переход? То-есть одна форма видна другую закрываем? Потом когда отработал скрипт, открываем вторую, а первую закрываем. Пробую сделать так но открывается не та форма что надо( и после отработанного кода открывается та же форма что и первая( PHP: <?php if($_GET['recovery']){ ?> <!-- форма востановления пароля введите E-mail --> <?php }else{ ?> <!-- форма восстановления пароля --> <?php } ?>
Короче не стал парится 20 минут еще посидел, и подумал разделю эти 2 формы на 2 файла и в них обработчики напишу) Все получилось вроде как, завтра протестирую еще и отпишусь, если конечно кого то интересует.
И в итоге довольно не плохо получилось восстановления пароля, взял готовый пример, разобрался как он работает, пару запросов в нем, было. Сделал проверку этой строки с генерируемой: PHP: //Тут идет запрос на проверку этой строки if(count('key') == 0){ erorr[] = 'Эта ссылка устарела'; //Делаем редирект на то место от куда пришел) }else{ Все хорошо меняем пароль выводим вторую форму))) } А вот как можно еще добавить такое, вот например он перешел по ссылке она например получилась такая: http://site.ru?new&key=jsdflajdflaj И когда он хочет изменить эту строку например убрать одну букву или что еще: сразу редиректом его перенаправляем на страницу от куда пришел? Или хватит того что если он переходит по старой ссылке, или меняет пароль то мы сообщаем что ссылка не действительна и редиректом перенаправляем, или джава скриптом) Только вот что а если он перешел по ссылке правильной, и потом стер букву специально без обновления страницы, и старается изменить пароль, то ему напишет что он изменил пароль, но на самом деле пароль в базе не поменяется, и-за того что стерта буква или цифра, просто уже тестировал и проверял. Если перешел по правильной ссылке, открываю форму где нужно менять пароль, и меняю в ссылке букву или цифру, и не обновляю страницу. Дальше пишу новый пароль, ему пишу что он поменял пароль, но в базе пароль не меняется и-за удаления или изменения ссылки. КАК ЕГО ПРЕДУПРЕДИТЬ из-за изменения ссылки ваш пароль не изменился? где прикрутить эту проверку? Или как узнать что он изменил ссылку, без перезагрузки страницы? Ну все жду ваших ответов, спасибо.
перед тем как меняешь пароль пользователю ты должен проверить его ключ для смены пароля, этот ключ передавай вместе с новым паролем, так ты сможешь опять проверить ключ перед изменением пароля. добавь ещё email пользователя, чтобы нельзя было просто перебирать ключ, а нужно было ещё и email указывать, так сложнее подобрать в базу запиши время когда запросили восстановление пароля, потом когда проверяешь ключ, то посмотри через SQL не прошло ли время, там простой запрос больше меньше, берёшь время из базы и прибавляешь 24 часа (SQL работы с временем) если оно больше времени из базы, то ещё не прошло 24 часа
@denis01 Первое, когда я нажимаю изменить пароль открывается форма для ввода емаил Второе я ввожу емаил и делаю проверку, если емаил есть, то отправляю письмо с этим ключем что в базе есть. Третье он переходит по ссылке, Четвертое проверяем ссылку если она ложная пишу что ее нет или она была уже использована, а если правильная то открываем вторую форму Пятое меняем пароль и заносим в базу новый пароль и новый ключ!!! Правильно ли? Или проверку ключа этого делать перед открытием второй формы? --- Добавлено --- @denis01 в базу запиши время когда запросили восстановление пароля, потом когда проверяешь ключ, то посмотри через SQL не прошло ли время, там простой запрос больше меньше, берёшь время из базы и прибавляешь 24 часа (SQL работы с временем) если оно больше времени из базы, то ещё не прошло 24 часа А как можно работать с временем в бд, покажите пожалуйста или дайте ссылку где можно посмотреть, как делать эти запрос.
@denis01 Вы можете мне объяснить для смены пароля нужно использовать: Этот код: PHP: $password = password_hash($_POST['pass'], PASSWORD_DEFAULT); Или этот: PHP: if (password_needs_rehash($new_password, PASSWORD_DEFAULT, ['cost' => 12])) { $new_password = password_hash($_POST['pass'], PASSWORD_DEFAULT, ['cost' => 12]); } Просто я и этот способ и этот пробую и у меня после смена пароля в базе записываются новые значения, а какой способ правильный, если первый способ отвечает за создания хеша пароля, а второй для проверки создания нового хеша или что то в том духе.
1. Используется для создания хэша пароля 2. Используется при изменении алгоритма создания хэша. Что бы перехешировать пароли пользователей во время аутентификации.
@romach 1. способ можно использовать что бы создать новый хеш? 2. способ я так понял не обязателен, для изменения пароля и он не подходит?
@TeslaFeo @romach Так вы за какой способ ведете речь? Я же написал и первый и второй при изменении пароля меняю в таблице хеш пароля. А какой правильный, не знаю я оставил 1-вый способ)
Народ кто подскажет как проверить сессию она есть в данный момент или нет. Ну например, когда я вошел на сайт. А то я делаю вход, если нажму на главную, у и потом опять на вход мне надо опять вводить данные для входа. Я фиг его знаю как его оставить в сессии если он ее не уничтожил, и не нажал на выход.