Intereting Posts

забудьте пароль, создав сгенерированный пароль для отправки по электронной почте пользователю.

Я пытаюсь создать страницу забытого пароля. Я слышал, что отправить исходный пароль пользователю по электронной почте не рекомендуется, поэтому я пытаюсь создать случайный пароль подтверждения, который они могут использовать для входа в свою учетную запись, а затем изменить пароль на все, что захочет. Пока проблема заключается в том, что сообщение электронной почты пользователей не находится в базе данных, когда на самом деле это так. Кроме того, следует ли обновлять базу данных для хранения случайного пароля или будет ли он работать? В моей базе данных есть имя пользователя, fristname, email и пароль. Я прошу пользователя указать адрес электронной почты в форме 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> 

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

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

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

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

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

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

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

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

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

    $salt = $user_record['password_salt'];

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

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

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

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

  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, но функции, которые содержатся, универсальны.

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

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

 $password =$_P0ST['password']; 

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

 $your_password = createRandomPassword(); 

вместо:

 $your_password=$rows['password']; 

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

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

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

Несколько проблем, которые следует отметить:

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

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

    $ tbl_name = "Account_Holders";

    Вероятно, поэтому вы не находите адрес электронной почты пользователя в db.

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

    UPDATE Account_Holders SET Password = '$ password' WHERE Email = '$ email';

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

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

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

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

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

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

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

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

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

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