Запрос SQL для имени пользователя и пароля возврата - PullRequest
2 голосов
/ 14 августа 2011

У меня есть база данных имен пользователей и паролей.Мне нужно создать функцию «Забыли пароль» и заставить ее искать в таблице имя пользователя и возвращать пароль этого пользователя.Затем я хотел бы отправить электронное письмо с именем и паролем.

Вот мой рабочий код для запроса базы данных для конкретного пользователя:

<?php
session_start();

include "config.php";

if($_POST['nameQuery']) {

$query = "SELECT * FROM myDatabase WHERE name = '" .$_POST['nameQuery']. "'";  
$result = mysql_query($query);  
if (mysql_num_rows($result) > 0) { 
    //User exists
    echo '1'; 
} else { 
    mysql_query($query);
//User does not exist
echo '0'; 
}
}
?>

Ответы [ 10 ]

13 голосов
/ 14 августа 2011

НЕ хранить пароли в вашей базе данных.Пароли открытого текста никогда не должны храниться.Вы должны хранить хэш паролей, чтобы предотвратить их использование на других сайтах.См. Лучший способ сохранить пароль в базе данных для получения дополнительной информации.

6 голосов
/ 14 августа 2011

Ваш код НЕ защищен ! Ваш $_POST['nameQuery'] - великолепная открытая дверь для SQL-инъекции

Минимальный уровень безопасности - сбежать и дезинфицировать все ваши данные

$nameQuery = mysql_real_escape_string ($_POST['nameQuery']);

Золотое правило: никогда не доверяйте входящим данным .

3 голосов
/ 14 августа 2011

Перво-наперво: возможно, вы захотите убедиться, что вы не получите SQL-injected через свой логин, поскольку вы буквально вводите пользовательский ввод в свой запрос ... большой нет-нет.

Поменяйте местами:

$query = "SELECT * FROM myDatabase WHERE name = '" .$_POST['nameQuery']. "'";  

... для этого:

$query = sprintf(
    'SELECT * FROM myDatabase WHERE name = \'%s\'', 
    mysql_real_escape_string($_POST['nameQuery'])
);

Далее вам нужно то, что вы просили: способ получить имя пользователя и пароль.Несмотря на то, что я не рекомендую хранить пароль в открытом виде для всеобщего просмотра, это решение вы должны принять самостоятельно.

Этот фрагмент поможет вам:

<?php
    //Get the data from the DB
    $query = sprintf(
        'SELECT * FROM myDatabase WHERE name = \'%s\'', 
        mysql_real_escape_string($_POST['nameQuery'])
    );
    $result = mysql_query($query);
    $user_info = mysql_fetch_assoc($result);

    //Check if it's valid
    if( isset($user_info['name']) ) {

        //Construct the message
        $message = 'Your username is: ' . $user_info['name'] . "\n"
        $message .= 'Your password is: ' . $user_info['password'] . "\n";

        //Send it to the appropriate email
        $status = mail(
            $user_info['email'], 
            'Password recovery for ' . $user_info['name'], 
            $message
        );

        //Check if it actually worked
        if( $status ) echo 'Mail sent. Check your inbox. Login again. Thank you.';
        else echo 'The password recovery couldn\'nt be sent. Please try again later.';

    } else { 

        echo 'No user found with the supplied username.', 
            'Please try again (with another username)';

    }
?>

Edit: Adding password recovery-functionality

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

recover_password.php:

<?php
    session_start();


    //mysql_connect()-here

    //Initalize the variable
    $do_update_password = false;

    //Grab the  token
    $token = isset($_REQUEST['token'])? $_REQUEST['token'] : '';
    $is_post_request = isset($_POST['update_pwd'])? true : false;
    $is_recovery_request = isset($_POST['request_recovery'])? true : false;
    $message = '';

    //Check if we're supposed to act upon a token
    if( $is_recovery_request ) {

        //Grab the email
        $email = isset($_POST['email'])? $_POST['email'] : '';

        //Create the query, execute it and fetch the results
        $sql = sprintf(
            'SELECT `user_id` FROM myDatabase WHERE `email` = \'%s\'',
            mysql_real_escape_string($email)
        );
        $result = mysql_query($sql);
        $user_info = mysql_fetch_assoc($result);

        //Validate the response
        if( isset($user_info['user_id') ) {

            //Let's generate a token
            $date = date('Y-m-d H:i:s');
            $token = md5($email . $date);

            //Create the "request"
            $sql = sprintf(
                'INSERT INTO myRequests (`user_id`, `token`, `date`) VALUES (\'%s\', \'%s\', \'%s\')',
                $user_info['user_id'],
                mysql_real_escape_string($token),
                $date
            );
            $result = mysql_query($sql);

            //Validate
            if( mysql_affected_rows($result) == 1 ) {


                //Construct the message
                $message = 'Your username is: ' . $user_info['email'] . "\n"
                $message .= 'Please click on the following link to update your password: http://yoursite.com/request_password.php?token=' . $token . "\n";

                //Send it to the appropriate email
                $status = mail(
                    $email, 
                    'Password recovery for ' . $email, 
                    $message
                );

                //Check if it actually worked
                if( $status ) {

                    echo 'Mail sent. Check your inbox. Login again. Thank you.';

                } else {

                    echo 'The password recovery couldn\'nt be sent. Please try again later.';

                }

            } else {

                $message = 'The DB-query failed. Sorry!';

            }

        } else {

            $message = 'The specified e-mail address could not be found in the system.';

        }

    } elseif( $token != '' ) {

        //Check so that the token is valid length-wise (32 characters ala md5)
        if( !isset($token[31]) || !isset($token[32])  ) { 

            $message = 'Invalid token!';

        } else {

            //Construct the query and execute it
            $sql = sprintf(
                'SELECT `user_id` FROM myRequest WHERE `token` = \'%s\'', 
                mysql_real_escape_string($token);
            );
            $result = mysql_query($sql);

            //Fetch the rows
            $request_info = mysql_fetch_assoc($result);

            //Check for a valid result
            if( isset($request_info['user_id']) ) {

                $message = 'Update your password below.';
                $do_update_password = true;

            } else {

                $message = 'No record found for the following token: ' . $token);

            }
        }
    } elseif( $is_post_request ) {

        //Grab the new password
        $password = isset($_POST['password'])? $_POST['password'] : '';

        //Construct the query
        $sql = sprintf(
            'UPDATE myDatabase SET `password` = \'%s\' WHERE `user_id` = ( SELECT `user_id` FROM myRequest WHERE `token` = \'%s\' )', 
            mysql_real_escape_string($password),
            mysql_real_escape_string($token)
        );    

        //Execute it, and check the results
        $result = mysql_query($sql);
        if( $result !== false ) {

            //Did we succeed?
            if( mysql_affected_rows($result) === 1 ) {

                //Remove the old recovery-request
                $sql = sprintf(
                    'DELETE FROM myRequests WHERE `token` = \'%s\'',
                    mysql_real_escape_string($token)
                );
                $result = mysql_query($sql);

                //^We don't actually need to validate it, but you can if you want to
                $message = 'Password updated. Go have fun!';

            } else {

                $message = 'Could not update the password. Are you sure that the token is correct?';

            }

        } else {

            $message = 'Error in the SQL-query. Please try again.';

        }
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Password recovery</title>
        <style>
            form > * { display: block; }
        </style>
    </head>
    <body>
        <h1><?php echo $message; ?></h1>
        <?php if( $do_update_password ): ?>

            <form method="post">
                <label for="token">Token:</label>
                <input type="text" name="token" id="token" value="<?php echo $token; ?>" />
                <label for="password1">Password:</label>
                <input type="text" name="password[]" id="password1" />
                <label for="password2">Password (again):</label>
                <input type="text" name="password[]" id="password2" /> 
                <input type="submit" name="update_pwd" value="Update your password!" />
            </form>

        <?php elseif($is_post_request && $token != ''): ?>

            <h2>Request that might've updated your password. Exciting!</h2>

        <?php else: ?>

            <form method="post">
                <label for="email">E-mail address:</label>
                <input type="text" name="email" id="email" />
                <input type="submit" name="request_recovery" value="Request a new password" />
            </form>

        <?php endif; ?>
    </body>
</html>

Обратите внимание, что у меня естьУ меня не было времени, чтобы на самом деле протестировать код, но я думаю, что он будет хорошо работать с некоторыми небольшими изменениями.О, прежде чем я забуду, вам нужно добавить следующую таблицу в БД:

Структура таблицы для таблицы myRequests

CREATE TABLE IF NOT EXISTS `myRequests` (
  `request_id` int(6) NOT NULL AUTO_INCREMENT,
  `token` varchar(32) NOT NULL,
  `user_id` int(6) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`request_id`),
  UNIQUE KEY `token` (`token`,`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Удачи!

3 голосов
/ 14 августа 2011

Сообщество Wiki:

Не.Потому что это означает, что вы будете сохранять извлекаемые пароли.Лучше отправить ссылку для изменения пароля на их электронную почту, которая дает доступ к странице одноразового сброса пароля.Таким образом, пароль не будет изменен до тех пор, пока кто-нибудь, имеющий доступ к электронной почте этого пользователя, не завершит цикл сброса.

Таким образом, вы можете соответствующим образом хешировать пароли и проверять входящие пароли только по хешу.

Кроме того, я рекомендую изучить php's PDO , потому что в настоящее время вы создаете sql-запросы, которые могут быть внедрены в sql-инъекции.

2 голосов
/ 14 августа 2011

У меня есть несколько предложений для вас

  1. Не отправляйте людям пароль, а предоставьте им ссылку для изменения пароля
  2. Изучите предложение Кджетила

удачи и счастливого кодирования

1 голос
/ 14 августа 2011

Просто прочитайте результат:

/* ... */
if (mysql_num_rows($result) > 0) {
  // User exists
  $row = mysql_fetch_row($result);
  print_r($row);
}
/* ... */

На более общем замечании: у вас есть уязвимость SQL-инъекций в вашем коде, посмотрите эту тему, иначе злоумышленники смогут прочитать все пароли вашего пользователя.

Кроме того, не рекомендуется хранить пароль в виде открытого текста в вашей базе данных.Пожалуйста, используйте алгоритм хеширования, например, sha1 или sha256 для хранения паролей.

1 голос
/ 14 августа 2011

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

Вместо этого ваш забытый пароль должен создать новый (временный) пароль и сохранить его в базе данных, аотправка простого текстового пароля на адрес электронной почты в файле.

0 голосов
/ 14 августа 2011

Я рекомендую вам изменить дизайн таблицы на

  • Имя пользователя
  • Пароль 'store hash
  • Вопрос для получения пароля' store hash
  • Password Retrieval Answer 'store hash

При входе в систему проверьте пользователя по хешированному паролю, что-то вроде этого

$_POST['password']=sha1($_POST['password']);

При входе в систему используйте sql как
select col1, col2, .. из таблицы, где пользователь =?и пароль =?и затем заполните параметр с помощью $ _POST ['username'], $ _POST ['password']

, поэтому используйте Prepared Statement или PDO

, используйте ту же логику, когдапользователь забыл свой пароль

0 голосов
/ 14 августа 2011
<?php
session_start();

include "config.php";

if($_POST['nameQuery']) {

    $query = "SELECT * FROM myDatabase WHERE name = '" .mysql_real_escape_string($_POST['nameQuery']). "'";  
    $result = mysql_query($query) or die ('Error: '.mysql_error());  
    if (mysql_num_rows($result) > 0) { 
        $row = mysql_fetch_assoc($result);
        $message = 'Your password is: '.$row['password'];
        if(mail($row['user_email'], 'Lost password', $message)){
            echo 'Password sent';
        }
    } else { 
        echo 'Nu such user'; 
    }
}
?>
0 голосов
/ 14 августа 2011

Вы должны получить имя пользователя и пароль из результата mysql_query (хранится в переменной $result) следующим образом:

$row = mysql_fetch_array($result);
$username = $row['username'];
$password = $row['password'];

Затем используйте функцию php mail () для отправки электронной почты.

...