страница забыли пароль, создав сгенерированный пароль для электронной почты пользователю - PullRequest
0 голосов
/ 27 ноября 2011

Я пытаюсь создать страницу забытого пароля. Я слышал, что отправлять оригинальный пароль пользователю по электронной почте не очень хорошая идея, поэтому я пытаюсь создать случайный пароль для подтверждения, который он может использовать для входа в свою учетную запись, а затем изменить пароль на любой другой, какой он пожелает. Пока проблема в том, что электронная почта пользователя отсутствует в базе данных, хотя на самом деле она есть. Кроме того, я должен обновить базу данных для хранения случайного пароля или будет работать так, как он у меня? В моей базе данных есть таблицы username, fristname, email и password. Я спрашиваю у пользователя его адрес электронной почты в форме HTML, а затем отправляю его в эту форму PHP. Это моя первая попытка сделать это, так что в ней может быть много ошибок, но я нашел учебник, чтобы помочь некоторым, поэтому это не должно. Спасибо за помощь.

<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Sending Password</title>
    </head>
    <body>
        <?php
      $db_server = "server";
       $db_username = "name";
       $db_password = "pass";

       $con = mysql_connect($db_server, $db_username, $db_password);if (!$con)
                {
                    die('Could not connect: ' . mysql_error());
                }

               $database = "Test_Members";  

              $er = mysql_select_db($db_username);
        if (!$er) 
        {
         print ("Error - Could not select the database");
         exit;
        }        

        //include "session.php";


function createRandomPassword() {



    $chars = "abcdefghijkmnopqrstuvwxyz023456789";

    srand((double)microtime()*1000000);

    $i = 0;

    $pass = '' ;



    while ($i <= 7) {

        $num = rand() % 33;

        $tmp = substr($chars, $num, 1);

        $pass = $pass . $tmp;

        $i++;

    }
    return $pass;

}

$password = createRandomPassword();
$password =$_P0ST['password']; 
      $email = $_P0ST['email']; 

        $tbl_name=Account_Holders;


        $sql="SELECT password FROM $tbl_name WHERE email='$email'";
        $result=mysql_query($sql);

        // if found this e-mail address, row must be 1 row
        // keep value in variable name "$count"
        $count=mysql_num_rows($result);


        // compare if $count =1 row
        if($count==1){

        $rows=mysql_fetch_array($result);

        // keep password in $your_password
        $your_password=$rows['password']; //will this replace the users password with the random one? That is what I am attempting to do here. 

        // send e-mail to ...
        $to=$email;

        // Your subject
        $subject="Your Password";

        // From
        $header="from: Feed The Students";

        // Your message
        $messages= "Your password for login to our website \r\n";
        $messages.="Your password is $your_password \r\n";
        $messages.="Please change this password for security reasons. Thank you. \r\n";

        // send email
        $sentmail = mail($to,$subject,$messages,$header);

        }

        // else if $count not equal 1
        else {
        echo "Sorry we did not find your email in our database.";
        }

        // if your email succesfully sent
        if($sentmail){
        echo "Your password has been sent to your email address.";
        }
        else {
        echo "We can not send your password at this time.";
        }



        ?>


    </body>
</html>

Ответы [ 4 ]

5 голосов
/ 27 ноября 2011

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

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

Чтобы сделать вещи еще более сложными, попробуйте изменить соль каждого хэша.

Вот пошаговый метод, который я использую:

  1. Пользователь создаетпароль (через регистрационную форму)
  2. Функция создает случайную соль, а затем шифрует пароль, в этом случае, используя алгоритм SHA256 и используя случайно созданную соль.

    $password_salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

    $password_hash = hash('sha256', $salt . $password);

  3. Сохраните $ password_hash и $ password_salt в таблицу пользователей.Они будут использованы позже для аутентификации пользователя при попытке входа в будущем.

  4. Когда пользователь входит в систему, проверьте имя пользователя / адрес электронной почты / логин и, если он найден, возьмите хэш и соль из таблицы пользователей и сравните хэш пароля из БД с возвращенным хешем.от выполнения той же функции на том, что они ввели в качестве своего пароля.

    $salt = $user_record['password_salt'];

    $entered_hash = hash('sha256', $salt . $entered_password);

В приведенном выше случае, если $enter_password_hash == $ user_record ['password_hash'] ($ user_record, то, что исходит из вашей базы данных), тогда пароль проверяется.

Примечание Чтобы сделать вещи более сложными, я на самом деле хранюхэш пароля и соль в том же поле в БД.Вы можете объединить их вместе, так или иначе, так что если ваша база данных скомпрометирована, поле пароля фактически бесполезно для получения пользовательских паролей.

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

  1. Создайте таблицу email_authentication с двумя столбцами - ИД пользователя и ключ.Он будет содержать информацию, которая будет связывать идентификаторы пользователей со случайно сгенерированным ключом.
  2. Создайте страницу (например, reset.php), которая ожидает параметр URL (например, $ k), а затем ищет параметр втаблица email_authentication.Если в таблице найдена совпадающая запись, удалите ее и перенаправьте на страницу, на которой будет разрешен пароль для идентификатора пользователя в той же записи.
  3. Пользователь забывает свой пароль, нажимает ссылку Забыли пароль и вводитих правильный адрес электронной почты.
  4. Запись создается в таблице email_authentication, содержащей их ИД пользователя, и для ключа генерируется случайная строка (длиной не более 32 символов) (например: 'r4nd0mstr1ng')
  5. Отправьте пользователю по электронной почте ссылку настраница, созданная на шаге 2, с ключом, созданным в строке URL-адреса.(например: http://foo.com/reset.php?k=r4nd0mstr1ng
  6. Пользователь щелкает ссылку в сообщении электронной почты, скрипт в файле reset.php ищет «r4nd0mstr1ng» в таблице email_authentication и находит его связанным с идентификатором пользователя, и они перенаправляются в формучто позволяет им сбросить свой пароль.
  7. Когда пароль сброшен, не сохраняйте его открытым текстом !!

Для получения дополнительной информации (и, возможно, лучшего объяснения хеширования паролятехнику, посмотрите на Это сообщение от HeyBigName . Он основан на CodeIgniter, но содержащиеся в нем функции универсально применимы.

0 голосов
/ 27 ноября 2011

Несколько проблем, на которые стоит обратить внимание:

  1. Сразу после создания переменной $ password с помощью createRandomPassword () вы перезаписываете ее значением в $ _POST ['password'].

  2. Вам необходимо поставить кавычки вокруг вашего назначения $ tbl_name, то есть:

    $ tbl_name = "Account_Holders";

    Возможно, поэтому вы не находите электронную почту пользователя в БД.

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

    ОБНОВЛЕНИЕ Account_Holders SET Password = '$ password' WHERE Email = '$ email';

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

0 голосов
/ 27 ноября 2011

Пока проблема в том, что электронная почта пользователя отсутствует в базе данных, хотя на самом деле она есть.

Насколько я понимаю, в вашем запросе нет ничего плохого, но не добавление значения $ tbl_name в кавычки, вероятно, не помогает. Кроме того, вы дважды проверили, что атрибут name на входе электронной почты также определенно является электронной почтой, и все ли это правильно совпадает?

Кроме того, я должен обновить базу данных для хранения случайного пароля или будет работать так, как он у меня?

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

example.com/reset/?id=THERE_ID&token=RANDOM_TOKEN

Затем на этой странице проверьте, совпадают ли они, и если это так, дайте им ввести новый пароль.

Я слышал, что отправлять оригинальный пароль пользователю по электронной почте не очень хорошая идея

Честно говоря, вам даже не следует хранить необработанные пароли в вашей БД, вам нужно искать такие вещи, как hash_hmac и соли паролей - там должно быть другие ссылки где-нибудь на этих типах страниц, чтобы вы могли разобраться со всеми учебными пособиями / примерами.

И, наконец, всегда проверяйте ваш пользовательский ввод ( регулярное выражение, например ), так как вы используете mysql_query, вы всегда хотите экранировать вводы также с помощью mysql_real_escape_string - предпочтительный метод для запросов - использовать подготовленные операторы , они очень хороши для предотвращения несчастных случаев, таких как маленькие таблицы Бобби , приходящие на ваш сайт.

0 голосов
/ 27 ноября 2011

Я предлагаю: 1 - пользователь нажимает «забыл пройти» и пишет имя пользователя и / или адрес электронной почты.Вы проверяете, есть ли имя пользователя и / или адрес электронной почты в вашей базе данных, если true, генерируете случайный код и сохраняете его в своей базе данных.2 - Отправьте пользователю электронное письмо со ссылкой, например: wwww.yourwebsite.com/forgot?recovery=CODEGENERATED 3 - Пользователь щелкает ссылку, и вы проверяете, существует ли код в вашей БД, если это правда, покажите форму для заполненияновый пароль.Пользователь заполняет, и ваша сохраненная БД.4 - Готово.

Вопрос: почему вы просите пользователя заполнить поле пароля, если у него нет пароля?

$password =$_P0ST['password']; 

И почему бы не использовать:

$your_password = createRandomPassword();

вместо:

$your_password=$rows['password'];

И почему эти две строки:

$password = createRandomPassword();
$password =$_P0ST['password']; 

Первая генерирует новый пароль, но вы устанавливаете значение, размещенное на том же самомпеременная ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...