Как отправить электронное письмо со ссылкой для сброса пароля в PHP - PullRequest
0 голосов
/ 31 октября 2018

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

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

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

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

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

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

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

Thx

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

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Использование 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

0 голосов
/ 31 октября 2018

расшифровывать пароль не рекомендуется

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

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

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

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

0 голосов
/ 31 октября 2018
<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 для обновления нового пароля

...