PHP Шифрование паролей в Фруктовой Ферме стандартной функцией md5Password()

pligin

Команда форума
Администратор
В скрипте каждой фруктовой фермы уже есть функция шифрования паролей с солью.
Функция называется md5Password() и находится в файле /classes/_class.func.php
Код:
/*======================================================================*\
    Function:    md5Password
    Descriiption: Возвращает md5_пароля
    \*======================================================================*/
    public function md5Password($pass){
        $pass = strtolower($pass);
        return md5("your_text"."your_text".$pass);
    
    }
Для подключения данной функции нужно изменить файлы регистрации, авторизации, восстановления пароля и размер поля пароля в базе данных, добавить функцию отправки письма со ссылкой восстановления паролля

1.
В файле /pages/_signup.php перед записью пароля в базу данных нужно создать его хэш при помощи функции md5Password()
Код:
$hash = $func->md5Password($pass);
и в базу данных вносим не пароль ($pass), а хэш пароля - $hash
Код:
# Регистрируем пользователя
$db->Query("INSERT INTO db_users_a (user, email, pass, referer, referer_id, date_reg, ip) VALUES ('$login','{$email}','$hash','$referer_name','$referer_id','$time',INET_ATON('$ip'))");

2.
В файлах /pages/_login.php /inc/_login.php нужно сверять не пароли, а их хэши
Код:
if(strtolower($log_data["pass"]) == $func->md5Password(strtolower($_POST["pass"]))){
либо
Код:
$hash = $func->md5Password(strtolower($_POST["pass"]));
if(strtolower($log_data["pass"]) == $hash){

3. После настройки функции шифрования паролей восстановление паролей уже невозможно и поэтому нужно применять изменение паролей. Нужно защитить изменение пароля, поэтому можно использовать изменение пароля при помощи отправки ссылки для изменения пароля на электронную почту.
Расписывать, что и как не буду, а приведу код файла восстановления пароля и запрос к базе данных. Кому интересно, разберется
Код:
<?PHP
$_OPTIMIZATION["title"] = "Восстановление пароля";
$_OPTIMIZATION["description"] = "Восстановление забытого пароля";
$_OPTIMIZATION["keywords"] = "Восстановление забытого пароля";

if(isset($_SESSION["user_id"])){ Header("Location: /account"); return; }

if(!isset($_GET["key"])){

?>
<div class="s-bk-lf">
    <div class="acc-title">Восстановление пароля</div>
</div>
<div class="silver-bk"><div class="clr"></div>
            
<p>Укажите Ваш Email, на него будет выслана ссылка для изменения пароля.</p>


<?PHP

    if(isset($_POST["email"])){

        if(isset($_SESSION["captcha"]) AND strtolower($_SESSION["captcha"]) == strtolower($_POST["captcha"])){
    
        unset($_SESSION["captcha"]);
    
        $email = $func->IsMail($_POST["email"]);
        $ttime = time();
        $tidex = time() - 60*15;
    
            if($email !== false){
        
            $db->Query("DELETE FROM db_recovery WHERE date_del < '".$ttime."' OR (date_add < '".$tidex."' AND email = '$email')");
            $db->Query("SELECT COUNT(*) FROM db_recovery WHERE ip = INET_ATON('".$func->UserIP."') OR email = '$email'");
        
                if($db->FetchRow() == 0){
            
                    $db->Query("SELECT COUNT(*) FROM db_users_a WHERE email = '$email'");
                
                    if($db->FetchRow() == 0){
                    echo "<center><font color = 'red'><b>Указанный Email не зарегистрирован в системе</b></font></center>";
                    }else {
                        # Заносим запись в db_recovery
                        $td = $ttime + 60*60;
                        $db->Query("INSERT INTO db_recovery (email, ip, date_add, date_del)
                        VALUES ('$email',INET_ATON('".$func->UserIP."'),'$ttime','$td')");
                    
                        $lid = $db->LastInsert();
                        $rec_key = $lid."-".md5($lid."_rfs_".$lid);
                    
                        # Отправляем на почту
                        $sender = new isender;
                        $sender -> SendRecKey($email, $rec_key);
                    
                        echo "<center><p><font color = 'green'><b>На Указанный Email была отправлена ссылка для восстановления пароля</b></font></p><p>Если письма нет, проверьте СПАМ</p></center>";
                        ?></div>
                        <div class="clr"></div>
                        <?PHP
                        return;
                    
                    }
                
                }else echo "<center><font color = 'red'><b>За последние 15 минут Вы уже запрашивали ссылку для восстановления пароля</b></font></center>";
        
            }else echo "<center><font color = 'red'><b>Email имеет неверный формат</b></font></center>";
    
        }else echo "<center><font color = 'red'><b>Символы с картинки введены неверно</b></font></center>";

    }
?>
<BR />
<form action="" method="post">
<table width="500" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td align="left" width="250">Email (На него вышлем ссылку):</td>
    <td align="left" width="250"><input name="email" type="text" size="25" maxlength="50" value="<?=(isset($_POST["email"])) ? $_POST["email"] : false; ?>"/></td>
  </tr>
  <tr>
    <td align="left" width="250" style="padding-top:20px;">
    <a href="#" onclick="ResetCaptcha(this);"><img src="/captcha.php?rnd=<?=rand(1,10000); ?>"  border="0" style="margin:0;"/></a>
    </td>
    <td align="left" width="250" style="padding-top:20px;">Введите символы с картинки<input name="captcha" type="text" size="25" maxlength="50" /></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><BR /><input type="submit" value="Выслать ссылку" class="button_0" style="height: 30px;"></td>
  </tr>
</table>

</form>
<BR />
</div>
<div class="clr"></div>
<?PHP

return;
}
?>
<div class="s-bk-lf">
    <div class="acc-title">Изменение пароля</div>
</div>
<div class="silver-bk"><div class="clr"></div>
<?PHP

# Смена пароля
$_GET["key"] = (string) $_GET["key"];

$token_data = explode('-', $_GET["key"]);

$token_id = intval($token_data[0]);
$token_hash = (string) $token_data[1];

    if(strlen($token_hash) != 32){ echo "<center><b><font color = 'red'>Ссылка для смены пароля не действительна :(</font></b></center><BR />"; return; }

    $tkey = md5($token_id."_rfs_".$token_id);
    if($token_hash != $tkey){ echo "<center><b><font color = 'red'>Ссылка для смены пароля не действительна :(</font></b></center><BR />"; return; }

    $db->Query("SELECT * FROM db_recovery WHERE id = '$token_id' LIMIT 1");
    if($db->NumRows() != 1){ echo "<center><b><font color = 'red'>Ссылка для смены пароля не действительна :(</font></b></center><BR />"; return; }

    $data_t = $db->FetchArray();
    $db->FreeMemory();

    # Измененияе пароля
    if(isset($_POST["pass"])){
    if(isset($_SESSION["captcha"]) AND strtolower($_SESSION["captcha"]) == strtolower($_POST["captcha"])){
    unset($_SESSION["captcha"]);
    $pass = $func->IsPassword($_POST["pass"]);
    $email = $data_t["email"];
        
                if($pass !== false){
                
                    if($pass == $_POST["repass"]){
                    
                        $hash = $func->md5Password($pass);
                        # Изменяем пароль
                        $db->Query("UPDATE db_users_a SET pass='$hash' WHERE email='$email'");
                        $lid = $db->LastInsert();
                    
                        # Удаляем rec key
                        $db->Query("DELETE FROM db_recovery WHERE email = '$email' OR id = '$token_id'");
                    
                        #отправляем пользователю письмо о смене пароля
                        $db->Query("SELECT user FROM db_users_a WHERE email = '$email' LIMIT 1");
                        $data_mail = $db->FetchArray();
                        $db->FreeMemory();
                        $sender = new isender;
                        $sender -> RecoveryPassword($data_mail["user"],$pass,$email);
                    
                        echo "<center><b><font color = 'green'>Вы успешно изменили пароль. Используйте форму слева для входа в аккаунт</font></b></center><BR />";
                        ?></div>
                        <div class="clr"></div>
                        <?PHP
                        return;
                    
                    }else echo "<center><b><font color = 'red'>Пароль и повтор пароля не совпадают</font></b></center><BR />";
        
                }else echo "<center><b><font color = 'red'>Пароль заполнен неверно</font></b></center><BR />";

        }else echo "<center><font color = 'red'><b>Символы с картинки введены неверно</b></font></center>";
    }

?>


<BR />
<form action="" method="post">
<table width="500" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td align="left" style="padding:3px;">Пароль: <font color="#FF0000">*</font></td>
    <td align="left" style="padding:3px;"><input name="pass" type="password" size="25" maxlength="20" /></td>
  </tr>
  <tr>
    <td colspan="2" align="left" style="padding:3px;">Поле Пароль должно иметь от 6 до 20 символов (только англ. символы).</td>
    </tr>
  <tr>
    <td align="left" style="padding:3px;">Пароль еще раз: <font color="#FF0000">*</font></td>
    <td align="left" style="padding:3px;"><input name="repass" type="password" size="25" maxlength="20" /></td>
  </tr>
  <tr>
    <td colspan="2" align="left" style="padding:3px;">Пароли должны совпадать.</td>
    </tr>
  <tr>
    <td align="left" style="padding:3px;">
    <a href="#" onclick="ResetCaptcha(this);"><img src="/captcha.php?rnd=<?=rand(1,10000); ?>"  border="0" style="margin:0;"/></a></td>
    <td align="left" style="padding:3px;">Введите символы с картинки<input name="captcha" type="text" size="25" maxlength="50" /></td>
  </tr>
  <tr>
    <td colspan="2" align="left">&nbsp;</td>
  </tr>
  <tr>
    <td colspan="2" align="center" style="padding:3px;"><input name="registr" type="submit" value="Изменить" style="height: 30px;"></td>
  </tr>
</table>
</form>

</div>
<div class="clr"></div>
Добавляем функцию отправки письма с ссылкой для изменения пароля на электронную почту в файл /classes/_class.isender.php
Код:
/*======================================================================*\
    Function:    SendReсKey
    Descriiption: Отправляет ключ смены пароля
    \*======================================================================*/
    function SendRecKey($email, $key){

        $text = "На ваш Email была запрошена ссылка для восстановления пароля в игре \"".$this->Hosts."\"<BR />";
        $text.= "Если вы не запрашивали ссылку, просто проигнорируйте это сообщение. <BR /><BR />";
        $text.= "Ссылка для восстановления: <a href='http://".$this->Hosts."/recovery/key/{$key}'>";
        $text.= "http://".$this->Hosts."/recovery/key/{$key}</a>";
        $subject = "Восстановление пароля в игре \"".$this->Hosts."\"";
    
        return $this->SendMail($email, $subject, $text);
    
    }
Делаем запрос к базе данных для создания таблицы для хранения ключей изменения пароля
Код:
CREATE TABLE IF NOT EXISTS `db_recovery` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(50) NOT NULL,
  `ip` int(10) unsigned NOT NULL DEFAULT '0',
  `date_add` int(11) NOT NULL DEFAULT '0',
  `date_del` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `ip` (`ip`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Добавить в .htaccess
Код:
# Восстановление пароля
RewriteRule ^recovery/key/(.*)(/?)+$ index.php?menu=recovery&key=$1 [L]
RewriteRule ^recovery(/?)+$ index.php?menu=recovery [L]
 

Stud26

Участник
Здравствуйте, после выполнения этих действий получаю ошибку при реге "Пароль и повтор пароля не совпадают". Скажите, где нужно редактировать сверку по хешу? Стандарт FF
 
Верх