Как отправить электронное письмо со ссылкой для сброса пароля в php

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

Я очень скоро добавлю информацию об электронной почте, когда пользователь создаст учетную запись на моем веб-сайте ...

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

Вот мой метод хеширования:

$options = ['cost' => 11, 'salt' => random_bytes(22)];
$passwordCrypter = password_hash($password, PASSWORD_BCRYPT, $options);

Я думаю, что нам нужно использовать этот метод, потому что расшифровывать пароль не рекомендуется, я думаю ...

Но почему ... Я хочу понять ...

Спасибо

Хороших парней

не расшифровывать пароли, хешировать ввод пользователя и сравнивать этот хеш с хешем в базе данных

delboy1978uk 31.10.2018 13:12

Я думаю, вам следует отправить ссылку для сброса пароля по электронной почте, и вы можете установить новый пароль при отправке формы сброса. К вашему сведению: salt устарел с> = PHP 7.0.0

Girish 31.10.2018 13:13

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

jeroen 31.10.2018 13:13

сгенерировать случайную строку, сохранить в базе данных и использовать как часть ссылки активации учетной записи, например example.com/…

delboy1978uk 31.10.2018 13:14

Функция passhword_hash() в php не может быть расшифрована. Вы можете использовать id пользователя, чтобы использовать метод GET и обновить пароль конкретного пользователя. Дайте ссылку на файл, который принимает значение GET с механизмом обновления пароля. Вы также можете использовать base64encode() в php, чтобы скрыть идентификатор от появления в URL-адресе.

Strooks 31.10.2018 13:20

Эта ссылка может вам помочь ссылка

Strooks 31.10.2018 13:25
password_hash() односторонний. Вы не можете и не должны уметь его расшифровать
Rotimi 31.10.2018 13:33

Я не нажимаю на эту ссылку

Rotimi 31.10.2018 13:36

Я уже использую password_verify, чтобы проверить, использует ли пользователь правильный пароль для подключения

Benoît Mignault 31.10.2018 22:08
0
9
8 251
3

Ответы 3

<html>
  <body>
    <form method="post" action="send_link.php">
      <p>Enter Email Address To Send Password Link</p>
      <input type="text" name="email">
      <input type="submit" name="submit_email">
    </form>
  </body>
</html>

Шаг 1. Создайте HTML-файл и определите разметку для системы сброса пароля.

<?php
if(isset($_POST['submit_email']) && $_POST['email'])
{
  mysql_connect('localhost','root','');
  mysql_select_db('sample');
  $select=mysql_query("select email,password from user where email='$email'");
  if(mysql_num_rows($select)==1)
  {
    while($row=mysql_fetch_array($select))
    {
      $email=md5($row['email']);
      $pass=md5($row['password']);
    }
    $link="<a href='www.samplewebsite.com/reset.php?key=".$email."&reset=".$pass."'>Click To Reset password</a>";
    require_once('phpmail/PHPMailerAutoload.php');
    $mail = new PHPMailer();
    $mail->CharSet =  "utf-8";
    $mail->IsSMTP();
    // enable SMTP authentication
    $mail->SMTPAuth = true;                  
    // GMAIL username
    $mail->Username = "your_email_id@gmail.com";
    // GMAIL password
    $mail->Password = "your_gmail_password";
    $mail->SMTPSecure = "ssl";  
    // sets GMAIL as the SMTP server
    $mail->Host = "smtp.gmail.com";
    // set the SMTP port for the GMAIL server
    $mail->Port = "465";
    $mail->From='your_gmail_id@gmail.com';
    $mail->FromName='your_name';
    $mail->AddAddress('reciever_email_id', 'reciever_name');
    $mail->Subject  =  'Reset Password';
    $mail->IsHTML(true);
    $mail->Body    = 'Click On This Link to Reset Password '.$pass.'';
    if($mail->Send())
    {
      echo "Check Your Email and Click on the link sent to your email";
    }
    else
    {
      echo "Mail Error - >".$mail->ErrorInfo;
    }
  } 
}
?>

Шаг 2. Создайте файл PHP для отправки ссылки

<?php
if($_GET['key'] && $_GET['reset'])
{
  $email=$_GET['key'];
  $pass=$_GET['reset'];
  mysql_connect('localhost','root','');
  mysql_select_db('sample');
  $select=mysql_query("select email,password from user where md5(email)='$email' and md5(password)='$pass'");
  if(mysql_num_rows($select)==1)
  {
    ?>
    <form method="post" action="submit_new.php">
    <input type="hidden" name="email" value="<?php echo $email;?>">
    <p>Enter New password</p>
    <input type="password" name='password'>
    <input type="submit" name="submit_password">
    </form>
    <?php
  }
}
?>

Шаг 3. Создайте файл PHP для сброса пароля

<?php
if(isset($_POST['submit_password']) && $_POST['key'] && $_POST['reset'])
{
  $email=$_POST['email'];
  $pass=$_POST['password'];
  mysql_connect('localhost','root','');
  mysql_select_db('sample');
  $select=mysql_query("update user set password='$pass' where email='$email'");
}
?>

Шаг 4. Создайте файл PHP для обновления нового пароля

Извините, но здесь все не так: Sql-инъекция, пароли в виде простого текста (или md5, что не намного лучше), устаревшие (не существующие в php 7+) функции mysql_* и т. д.

jeroen 31.10.2018 13:29

да, сэр, вы правы, но я думаю, что md5 () хорош для шифрования, потому что он не расшифровывается в php

coderboy_11 31.10.2018 13:33

Вы заменили надежный хеш-инструмент на md5()? Почему?

Rotimi 31.10.2018 13:34

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

symcbean 31.10.2018 14:37

Все мои данные защищены этим методом: $patternUser = "#^[0-9a-z]([0-9a-z]{0,13})[0-9a-z]$#"; if (!preg_match($patternUser, $champInitial['user'])) { $champInitial['champInvalid'] = true;

Benoît Mignault 31.10.2018 22:17

Использование PHPMailer Здесь Пример моего кода Где $ dir - ваш текущий каталог

function mailSet($to,$full_name,$subject,$body){
    require($dir.'vendor/mailer/PHPMailerAutoload.php');
    require($dir.'vendor/mailer/class.phpmailer.php');

    $mail = new PHPMailer();
    $mail->IsSMTP();
    $mail->Host = 'YOUR HOST';
    $mail->SMTPAuth = TRUE;

    $mail->Username = 'HOST EMAIL ACCOUNT'; 
    $mail->Password = 'HOST PASSWORD'; 

    $mail->From = 'FROM EMAIL';
    $mail->setFrom('FROM EMAIL', 'FULL NAME');

    $mail->AddAddress($to, $full_name);
    $mail->WordWrap = 70;

    $mail->Subject = $subject;
    $mail->Body = $body;

    $mail->IsHTML(TRUE);


    if(!$mail->Send()){
      echo 'SEND';
    } else {
     echo 'FAILED TO SEND';        }
}

function forgetPassword($account){
  global $dir;
  $data=getData('users',$account); //GET DATA FROM DATABASE
  $link=getDataBy('forget_password','account',$data['id']); //RELATION DATA FROM TABLE USERS
  $body='SOME TEXT <p>YOU CAN USE HTML TAG TO <a href="'.$dir.'login/changepassword?SESSION_ID='.$link['link'].'&&SESSION_VALID='.md5(rand(0,100)).'">LINK TO CLICK</a><p>END OF HTML TAG</p>';
  return $body;
}`

Пример почты PHP с использованием PHPMailer, где $ to = адрес электронной почты получателя, $ full_name = полное имя получателя, $ subject = тема электронной почты, $ body = EMAIL HTML BODY

to decrypt a password is not recommended

Если даже теоретически возможно расшифровать ваши пароли, значит, вы делаете это неправильно.

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

  • Когда кто-то утверждает личность и запрашивает сброс пароля, сгенерируйте токен с высокой избыточностью и ограниченным TTL, отправьте его пользователю по электронной почте. НЕ меняйте пароль.

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

Спасибо за информацию, я понимаю, что это не рекомендуется, и я не буду использовать его ... Я воспользуюсь способом отправить на свою почту ссылку, чтобы изменить пароль, связанная ссылка + пользователь

Benoît Mignault 31.10.2018 22:11

Другие вопросы по теме