Ru-MaNGOS

Вернуться   Ru-MaNGOS > Дополнения > WWW

Важная информация

WWW Web интерфейс для MaNGOS

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.06.2010, 09:16   #1
deadangel
Новичок
 
Аватар для deadangel
 
Регистрация: 28.04.2010
Адрес: Беларусь, Мозырь
Сообщений: 27
Сказал(а) спасибо: 12
Поблагодарили 6 раз(а) в 4 сообщениях
Записей в дневнике: 1
deadangel На верном пути
Отправить сообщение для deadangel с помощью ICQ Отправить сообщение для deadangel с помощью Skype™
По умолчанию Простая страница восстановления пароля

Написал простой скрипт восстановления пароля. Пароль в БД меняется, но в игру все равно заходит по старому паролю. Вопрос, как можно сделать так, чтобы после смены пароля сразу в игру можно было зайти по новому паролю?

Вот окончательный и переделанный вариант скрипта.


PHP код:
<?=header('Content-type: text/html; charset=utf-8');?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <title>Смена пароля для аккаунта World of Warcraft</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta name="author" content="Kazakou V. Andrey" />
    <meta name="email" content="a.v.kazakou@gmail.com" />
</head>
<body>

<?php
function error($str '')
{
    echo 
"<p class=\"error\">$str</p></body></html>";
    exit;
}

function 
sendPassword($login$email)
{
    
mysql_connect('<host>','<login>','<password>') or die(error('Ошибка! Невозможно соедениться с базой данных.'));
    
mysql_select_db('realmd');

    
$login mysql_real_escape_string($login);
    
$email mysql_real_escape_string($email);

    
$result mysql_query('SELECT COUNT(*) as validation FROM `account` WHERE `username` LIKE \''.$login.'\' AND `email` LIKE \''.$email.'\'') or die(error('Ошибка! Невозможно выполнить запрос в БД'));
    
$result mysql_fetch_array($result);
    if(
$result***91;'validation'***93;!=1error('Данная связка Логина и E-mail не обнаружена');

    
$psswd str_shuffle(substr(md5(rand(1,1024)), 06));
    
$sql "UPDATE `account` SET `sha_pass_hash`=SHA1(UPPER(CONCAT('$login',':','$psswd'))), `locked`=0, `v`=NULL, `s`=NULL, `sessionkey`=NULL  WHERE `username`='$login' AND `email`='$email'";
    
$result mysql_query($sql) or die(error(mysql_error().'</p><p>'.$sql));
    if(
mysql_affected_rows()!=1error('Невозможно изменить пароль в базе данных');

    
$to      $email;
    
$subject 'Смена пароля для World of Warcraft';
    
$message 'Ваш новый пароль для аккаунта '.$login.' в игре World of Warcraft: '.$psswd;
    
$headers 'From: robot@example.com' "\r\n" .
        
'Reply-To: robot@example.com' "\r\n" .
        
'Content-type: text/plain; charset=UTF-8' "\r\n" .
        
'X-Mailer: PHP/' phpversion();

    
$mailSended mail($to$subject$message$headers);
    if(!
$mailSendederror('Невозможно отправить письмо с новым паролем.');

    
error('Письмо с новым паролем выслано на указаный адрес.');
}
?>

<?php
    
if(!empty($_POST) and isset($_POST***91;'login'***93;) and isset($_POST***91;'email'***93;)) sendPassword($_POST***91;'login'***93;, $_POST***91;'email'***93;);
?>

    <form action="newpass.php" method="post">
    <table summary="">
            <tr>
                    <td>Имя аккаунта:</td>
                    <td><input type="text" name="login" value="" size="30"  /></td>

            </tr>
            <tr>
                    <td>Адрес e-mail:</td>
                    <td><input type="text" name="email" value="" size="30"  /></td>
            </tr>
            <tr>
                    <td colspan="2"><input type="submit" name="submit" value="Выслать новый пароль"  /></td>
            </tr>
    </table>
    </form>
</body>
</html>

Последний раз редактировалось deadangel; 04.06.2010 в 14:47. Причина: обновил скрипт
deadangel вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
StinK (01.06.2010)
Старый 01.06.2010, 09:23   #2
Mic
Гость
 
Сообщений: n/a
По умолчанию

Кажется, нужно по пути обнулить поля "s" и "v". Ну и про экранирование переменных перед подстановкой в запросы тоже не стоит забывать.
  Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
deadangel (03.06.2010), StinK (01.06.2010)
Старый 01.06.2010, 10:48   #3
Кот ДаWINчи
Умный
 
Аватар для Кот ДаWINчи
 
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
Кот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человек
Отправить сообщение для Кот ДаWINчи с помощью ICQ Отправить сообщение для Кот ДаWINчи с помощью Skype™
По умолчанию

Цитата:
Сообщение от Mic Посмотреть сообщение
Кажется, нужно по пути обнулить поля "s" и "v". Ну и про экранирование переменных перед подстановкой в запросы тоже не стоит забывать.
Правильно. И еще можно занулить sessionkey

Вот тут:

Цитата:
$sql = "UPDATE `account` SET `sha_pass_hash`=SHA1(CONCAT(UPPER('$login'),':',UP PER('$psswd'))), `locked`=0 WHERE `username` LIKE '$login' AND `email` LIKE '$email'";

Последний раз редактировалось Кот ДаWINчи; 02.08.2010 в 07:10.
Кот ДаWINчи вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
deadangel (02.06.2010), StinK (01.06.2010)
Старый 01.06.2010, 18:36   #4
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Только использовать LIKE в данном запросе совершенно неверно.
Да и вобще если использовать текущий вариант скрипта не безопасно.
alien вне форума   Ответить с цитированием
Старый 02.06.2010, 11:39   #5
deadangel
Новичок
 
Аватар для deadangel
 
Регистрация: 28.04.2010
Адрес: Беларусь, Мозырь
Сообщений: 27
Сказал(а) спасибо: 12
Поблагодарили 6 раз(а) в 4 сообщениях
Записей в дневнике: 1
deadangel На верном пути
Отправить сообщение для deadangel с помощью ICQ Отправить сообщение для deadangel с помощью Skype™
По умолчанию

Потенциально LIKE конечно опасен, но в конкретном случае я не вижу проблемы, как с его помощью можно взломать БД. Более того, у меня база персонажей хранится уже 3 года и раньше пользователи создавали имена аккаунтов в разном регистре и по сей день вводят их в этом регистре. Если ставить вместо Like условие равенства, то большая часть запорется. Т.к. все аккаунты давно уже хранятся в UP регистре.

Спасибо всем. В запросе установил обнуление полей V, S и sessionkey. пароль начал меняться как положено. Вот работающая версия скрипта. Может кому нибудь и пригодится

Код:
    $psswd = str_shuffle(substr(md5(rand(1,1024)), 0, 6));
    $sql = "UPDATE `account` SET `sha_pass_hash`=SHA1(CONCAT(UPPER('$login'),':',UPPER('$psswd'))), `locked`=0, `v`=NULL, `s`=NULL, `sessionkey`=NULL  WHERE `username` LIKE '$login' AND `email` LIKE '$email'";
    $result = mysql_query($sql) or die(error(mysql_error().'</p><p>'.$sql));

Последний раз редактировалось deadangel; 02.06.2010 в 14:19. Причина: Забыл удалить пароли к БД :)
deadangel вне форума   Ответить с цитированием
Старый 02.06.2010, 11:58   #6
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Вместо использования достачно внести в настройки sql нечуствительность регистра при равенстве.
А помешать очень просто можно сбросить пароль другому человеку.
alien вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
tempura (02.06.2010)
Старый 02.06.2010, 12:18   #7
deadangel
Новичок
 
Аватар для deadangel
 
Регистрация: 28.04.2010
Адрес: Беларусь, Мозырь
Сообщений: 27
Сказал(а) спасибо: 12
Поблагодарили 6 раз(а) в 4 сообщениях
Записей в дневнике: 1
deadangel На верном пути
Отправить сообщение для deadangel с помощью ICQ Отправить сообщение для deadangel с помощью Skype™
По умолчанию

Согласен. Если добавить % в имя пользователя, то как вариант он сбросит пароли. В таком случае придется делать регистронезависимое сравнение и для e-mail. Сейчас переделаю и сброшу окончательный вариант.
deadangel вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
tempura (02.06.2010)
Старый 02.06.2010, 14:16   #8
deadangel
Новичок
 
Аватар для deadangel
 
Регистрация: 28.04.2010
Адрес: Беларусь, Мозырь
Сообщений: 27
Сказал(а) спасибо: 12
Поблагодарили 6 раз(а) в 4 сообщениях
Записей в дневнике: 1
deadangel На верном пути
Отправить сообщение для deadangel с помощью ICQ Отправить сообщение для deadangel с помощью Skype™
По умолчанию

Вот окончательный вариант скрипта перенес в первый пост. Кто нибудь может подсказать его потенциально опасные моменты? В принципе у меня сервер настроен на независимость регистров при сравнении. Но если кому-то понадобится, то проще данные пользователя и БД приводить к верхнему регистру. В общем всех благодарю за помощь.

Последний раз редактировалось deadangel; 04.06.2010 в 14:29.
deadangel вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 02.06.2010, 16:38   #9
tempura
Forum bot
 
Аватар для tempura
 
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
tempura отключил(а) отображение уровня репутации
По умолчанию

Оба молодцы!


Простите, но просто вот ради именно такого общения и создан форум. Не ради "дайти ресофку скочадь", а ради вас, ребята!
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки.
tempura вне форума   Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
deadangel (03.06.2010), KiriX (04.06.2010), StinK (04.06.2010)
Старый 04.06.2010, 11:21   #10
Mic
Гость
 
Сообщений: n/a
По умолчанию

PHP код:
if(!empty($_POST)) sendPassword($_POST***91;'login'***93;, $_POST***91;'email'***93;); 
- потенциальный источник notice'ов. Массив-то может и не пустой, но этих элементов там может не быть.
Ну и мелкая придирочка CONCAT(UPPER('foo'), ':', UPPER('bar')) == UPPER(CONCAT('foo', ':', 'bar'))

Последний раз редактировалось Mic; 04.06.2010 в 11:24.
  Ответить с цитированием
Пользователь сказал cпасибо:
deadangel (04.06.2010)
Старый 04.06.2010, 14:49   #11
deadangel
Новичок
 
Аватар для deadangel
 
Регистрация: 28.04.2010
Адрес: Беларусь, Мозырь
Сообщений: 27
Сказал(а) спасибо: 12
Поблагодарили 6 раз(а) в 4 сообщениях
Записей в дневнике: 1
deadangel На верном пути
Отправить сообщение для deadangel с помощью ICQ Отправить сообщение для deadangel с помощью Skype™
По умолчанию

Поправил скрипт в первом посте. Спасибо за информацию
deadangel вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
tempura (04.06.2010)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 14:47. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot