Я люблю исследовать мир PHP через мой веб-сайт, создавая небольшие личные проекты, которые дают мне опыт для текущей и будущей работы, кто знает ...
Я очень скоро добавлю информацию об электронной почте, когда пользователь создаст учетную запись на моем веб-сайте ...
После нескольких часов исследования и чтения я не могу найти или понять, как отправить электронное письмо со ссылкой для сброса пароля пользователя ...
Вот мой метод хеширования:
$options = ['cost' => 11, 'salt' => random_bytes(22)];
$passwordCrypter = password_hash($password, PASSWORD_BCRYPT, $options);
Я думаю, что нам нужно использовать этот метод, потому что расшифровывать пароль не рекомендуется, я думаю ...
Но почему ... Я хочу понять ...
Спасибо
Хороших парней
Я думаю, вам следует отправить ссылку для сброса пароля по электронной почте, и вы можете установить новый пароль при отправке формы сброса. К вашему сведению: salt устарел с> = PHP 7.0.0
Ваш вопрос слишком широкий, вам нужно сузить его. И способ хеширования пароля не должен иметь никакого отношения к вашему механизму сброса пароля.
сгенерировать случайную строку, сохранить в базе данных и использовать как часть ссылки активации учетной записи, например example.com/…
Функция passhword_hash() в php не может быть расшифрована. Вы можете использовать id пользователя, чтобы использовать метод GET и обновить пароль конкретного пользователя. Дайте ссылку на файл, который принимает значение GET с механизмом обновления пароля. Вы также можете использовать base64encode() в php, чтобы скрыть идентификатор от появления в URL-адресе.
Эта ссылка может вам помочь ссылка
password_hash() односторонний. Вы не можете и не должны уметь его расшифровать
Я не нажимаю на эту ссылку
Я уже использую password_verify, чтобы проверить, использует ли пользователь правильный пароль для подключения






<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 = "[email protected]";
// 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='[email protected]';
$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_* и т. д.
да, сэр, вы правы, но я думаю, что md5 () хорош для шифрования, потому что он не расшифровывается в php
Вы заменили надежный хеш-инструмент на md5()? Почему?
«не расшифровывается в php» - вы не понимаете проблемную область. Вы можете начать решать эту проблему с чтения радужных таблиц, атак расширений и соления.
Все мои данные защищены этим методом: $patternUser = "#^[0-9a-z]([0-9a-z]{0,13})[0-9a-z]$#"; if (!preg_match($patternUser, $champInitial['user'])) { $champInitial['champInvalid'] = true;
Использование 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 не истек и что токен был выдан заявленному имени пользователя, а затем разрешите пользователю выбрать новый пароль.
Спасибо за информацию, я понимаю, что это не рекомендуется, и я не буду использовать его ... Я воспользуюсь способом отправить на свою почту ссылку, чтобы изменить пароль, связанная ссылка + пользователь
не расшифровывать пароли, хешировать ввод пользователя и сравнивать этот хеш с хешем в базе данных