Все мы знаем, что изменения пароля, при восстановлении происходит сразу, не спрашивая подтверждения пользователя, попробуем изменить это.
Если было, сильно не пинать, делал для себя, решил поделиться.
Открываем файл components/registration/frontend.php
Ищем условие if ($do==’passremind’){
меняем его содержимое на
Добавим новое условие проверки при активации нового пароля
Добавим новые языковые переменные в ланг файл languages/ru/components/registration.php
Изменим там же одну строку
сна Далее для создаем в корне файл custom_rewrite.php (если его еще не было, если уже есть то просто добавим строки)
с содержимым
Также добавим новое правило для ЧПУ в components/registration/router.php
Добавим новую таблицу в базу данных, в которой будут храниться хэш нового пароля и код его активации
Все, теперь при запросе нового пароля, пользователю будет отправляться email с сылкой подтверждения для
применения пароля, если пользователь не изменит его в течении суток, то придется процедуру повторить заново.
Архив с уже измененными файлами здесь
Если было, сильно не пинать, делал для себя, решил поделиться.
Открываем файл components/registration/frontend.php
Ищем условие if ($do==’passremind’){
меняем его содержимое на
if ($do=='passremind'){ $inPage->setTitle($_LANG['REMINDER_PASS']); $inPage->addPathway($_LANG['REMINDER_PASS'], $_SERVER['REQUEST_URI']); echo '<div class="con_heading">'.$_LANG['REMINDER_PASS'].'</div>'; //PRINT QUERY FORM echo '<form name="prform" action="" method="POST">'; echo '<table style="background-color:#EBEBEB" cellspacing="0" cellpadding="9"><tr>'; echo '<td>'.$_LANG['WRITE_REGISTRATION_EMAIL'].': </td>'; echo '<td><input name="email" type="text" size="25" /></td>'; echo '<td><input name="goremind" type="submit" value="'.$_LANG['SEND'].'"/></td>'; echo '</tr></table>'; echo '</form>'; } else { //SEND NEW PASSWORD TO EMAIL $email = $_POST['email']; echo '<p style="color:red">'.$_LANG['ERR_EMAIL'].'</p>'; } else { $sql = "SELECT * FROM cms_users WHERE email = '$email' LIMIT 1"; $result = $inDB->query($sql) ; if ($inDB->num_rows($result)>0){ $usr = $inDB->fetch_assoc($result); //Если запрашивается повторно, то старую запись с кодом подтверждения удаляем $sql = "DELETE FROM cms_users_activatepass WHERE user_id = '".$usr['id']."' "; $result = $inDB->query($sql); $codelink = 'http://'.$_SERVER['HTTP_HOST'].'/activatepass/'.$code; $sql = "INSERT INTO cms_users_activatepass (pubdate, user_id, code, pass) $mail_message = $_LANG['HELLO'].', ' . $usr['nickname'] . '!'. "\n\n"; $mail_message .= $_LANG['REMINDER_TEXT'].' "'.$inConf->sitename.'".' . "\n\n"; $mail_message .= $_LANG['OUR_PASS_IS_MD5'] . "\n"; $mail_message .= $_LANG['OUR_PASS_IS_MD5_TEXT'] . "\n\n"; $mail_message .= $_LANG['REMINDER_TEXT_1'] . "\n\n" .$codelink. "\n\n"; $mail_message .= $_LANG['REMINDER_TEXT_2'] . "\n\n"; $mail_message .= '########## '.$_LANG['YOUR_LOGIN'].': ' .$usr['login']. "\n\n"; $mail_message .= '########## '.$_LANG['YOUR_NEW_PASS'].': ' .$newpassword . "\n\n"; $mail_message .= $_LANG['YOU_CAN_CHANGE_PASS']."\n"; $mail_message .= $_LANG['IN_CONFIG_PROFILE'].': '. cmsUser::getProfileURL($usr['login']) . "\n\n"; $mail_message .= $_LANG['SIGNATURE'].', '. $inConf->sitename . ' ('.HOST.').' . "\n"; $inCore->mailText($email, $inConf->sitename.' - '.$_LANG['REMINDER_PASS'], $mail_message); echo '<p>'.$_LANG['NEW_PAS_SENDED'].'</p>'; } else { echo '<p style="color:red">'.$_LANG['ADRESS'].' "'.$email.'" '.$_LANG['NOT_IN_OUR_BASE'].'</p>'; } } } }
if ($do=='activatepass'){ //Удаляем "просроченные" записи $inDB->query($sql); $code = $inCore->request('code', 'str', ''); $sql = "SELECT * FROM cms_users_activatepass WHERE code = '".$code."' "; $result = $inDB->query($sql); if($inDB->num_rows($result)==1) { $row = $inDB->fetch_assoc($result); $sql = "UPDATE cms_users SET password = '".$row['pass']."' WHERE id = '".$row['user_id']."' "; $sql = "DELETE FROM cms_users_activatepass WHERE code = '$code'"; echo '<p>'.$_LANG['NEW_PAS_SUBMITED'].'</p>'; } else { echo '<p style="color:red">'.$_LANG['CODE_NOT_FOUND'].'</p>'; } }
$_LANG['REMINDER_TEXT_1'] ='Для смены пароля перейдите по ссылке'; $_LANG['REMINDER_TEXT_2'] ='Если Вы не запрашивали смену пароля, просто проигнорируйте данное письмо.'; $_LANG['NEW_PAS_SUBMITED'] ='Ваш пароль успешно изменен.'; $_LANG['CODE_NOT_FOUND'] ='Извините, код активации не найден.';
с
$_LANG['NEW_PAS_SENDED'] ='Новый пароль был выслан на указанный e-mail.';
$_LANG['NEW_PAS_SENDED'] ='Инструкция по активации нового пароля была выслана на указанный e-mail.';
с содержимым
<?php function custom_rewrite_rules(){ 'source' => '/^activatepass\/(.+)$/i', 'target' => 'registration/activatepass/{1}', 'action' => 'rewrite' ); return $rules; } ?>
'_uri' => '/^registration\/activatepass\/(.+)$/i', 'do' => 'activatepass', 1 => 'code' );
CREATE TABLE `cms_users_activatepass` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pubdate` int(11) NOT NULL, `user_id` int(11) NOT NULL, `code` varchar(50) NOT NULL, `pass` varchar(50) NOT NULL, ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
применения пароля, если пользователь не изменит его в течении суток, то придется процедуру повторить заново.
Архив с уже измененными файлами здесь
Реклама #
Hmelex 14 лет назад #
mihalich 14 лет назад #
mihalich 14 лет назад #
14 лет назад #
1. Человек забыл пароль, вводит email в форме восстановления
2. Приходит письмо с текстом, "Вы запросили новый пароль, перейдите по ссылке", которая ведёт на форму, в которой он САМ вводит новый пароль. Ссылка должна быть специально сформирована, например site.ru/login/?auth=asdf564ewrsdf546asdf, по которой он сможет автоматически авторизоваться, т.е. содержать некий секретный ключ, например это может быть md5 на user_id + user_email + user_password, это гарантирует нам что ключ будет разный при смене пароля, и злоумышленнику будет практически невозможно её сформировать
3. И в почту никакие пароли не приходят, т.е. его будет знать только один юзер.
4. Профит!
Atheist 14 лет назад #
ГеймОверСистемХалтед 14 лет назад #
Atheist 14 лет назад #
Atheist 14 лет назад #
Fuze 14 лет назад #
Если действительно попробовать переделать так, как bibendi предложил?
Atheist 14 лет назад #
14 лет назад #
Otus7 14 лет назад #
14 лет назад #
Руби - это просто сказочный язык
mihalich 14 лет назад #