Не удается заставить работать простую (без шифрования) форму php forgot password form

#php #mysql #phpmailer

#php #mysql #phpmailer

Вопрос:

Ну, я занимался этим с системой аутентификации php / mysql в течение нескольких недель, собирая ее из учебников и изучая по ходу дела. Сейчас я нахожусь в сложной части, которая является страницей пароля forgot.php . У меня мало опыта phpmail , и, похоже, в этом коде есть много фундаментальных ошибок.

Во-первых, поскольку я добавил код с phpmail информацией, страница просто пуста. Но даже когда он работал, страница просто становилась пустой после того, как пользователь нажимал «Отправить». Не уверен, что мешает форме даже отображаться. Кроме того, не уверен, правильно ли я это делаю с точки зрения рабочей формы php password forgot email.

Код на login.php:

 <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
Remember me: <input type="checkbox" name="remember" /><br />

<input type="submit" name="submit" value="Login" />
<a href="forgot.php">Forgot Password?</a>




<?php
session_start();
require_once("functions.php");
require_once("db-const.php");
require("class.phpmailer.php");


$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

if (logged_in() == true) {
redirect_to("profile.php");
}

?>
<html>
<head>
<title>Forgot your Username or Password?</title>
</head>
<body>  
<h1>Forgot your Username or Password?</h1>

<p>Please enter your email address below.</p>
<form action="forgot.php" method="post">
Email: <input type="text" name="email" />
<input type="submit" name="submit" value="Submit" />
</form>
<?php

if (isset($_POST['submit'])) {
## connect mysql server
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
# check connection
if ($mysqli->connect_errno) {
echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>";
exit();

}


## query database
# fetch data from mysql database
$sql = "SELECT email FROM users WHERE email LIKE '{$_POST['email']}' LIMIT 1";

if ($result = $mysqli->query($sql)) {
$user = $result->fetch_array();
} else {
echo "<p>MySQL error no {$mysqli->errno} : {$mysqli->error}</p>";
exit();
            }



$mail = new PHPMailer();

$mail->IsSMTP();  // telling the class to use SMTP
$mail->Host     = "smtp.practice.com"; // SMTP server

$mail->From     = "support@practice.com";

$mail->Subject  = "login information";
$mail->Body     = "Hello, here is your login information. User name is: $username and your    
password is $password;"
$mail->WordWrap = 50;


if ($result->num_rows == 1) {

echo "<p>Login credentials have been sent to <b>{$_POST['email']}</b></p>";
} else {
echo "<p>Sorry, no user found with this email.</p>";
}
}
?>
<a href="login.php">Login</a> | <a href="register.php">Register</a>
</body>
</html>
 

Комментарии:

1. вы используете это на localhost?

2. Знаете ли вы, как проверить журналы ошибок или даже включить проверку ошибок в браузере?

3. Я рекомендую вам изучить «SQL-инъекцию», прежде чем использовать этот код в производстве.

4. Привет, Джейк, я знаю путь к ini-файлу, который является /usr/local/lib/php.ini. Должен ли я просто скопировать этот файл в свой root, чтобы включить проверку ошибок?

5. Привет, Джоди, да, я использую localhost на веб-сервере godaddy. Я читал о SQL-инъекции. Не беспокоиться об использовании живой среды, поскольку я делаю все это только для того, чтобы учиться, и не беспокоиться о взломе. Какова альтернатива? Mamp?

Ответ №1:

К сожалению, в вашем коде много ошибок, как указывали другие.

  • Вы создаете сообщение до того, как узнаете, существует ли пользователь.
  • Вы уязвимы для SQL-инъекций.
  • Вы не отправляете сообщение (не вызываете $mail->send(); )
  • Вы используете старую версию PHPMailer.
  • Создаваемое вами сообщение содержит имя пользователя и пароль, предоставленные пользователем, а не имя пользователя и пароль, которые вы получили из базы данных.
  • Я надеюсь, что вы не храните пароль в виде обычного текста в БД!
  • Пустые экраны обычно означают ошибки PHP — вызов ini_set('display_errors', true);

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