【问题标题】:Can't get simple (no encryption) php forgot password form to work无法简单(无加密)php忘记密码表单工作
【发布时间】:2014-06-27 05:09:15
【问题描述】:

嗯,我已经使用 php/mysql 身份验证系统数周了,从教程中拼凑起来,边学习边学习。我现在处于一个棘手的部分,即密码forgot.php 页面。我对phpmail 没有什么经验,而且这段代码似乎有很多根本性的错误。

首先,因为我添加了关于phpmail 信息的代码,所以页面是空白的。但即使它正在工作,在用户点击提交后页面也会变成空白。不知道是什么让表单无法显示。此外,不确定我是否在工作 php 密码忘记电子邮件表单方面正确处理此问题。

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>

【问题讨论】:

  • 你是在本地主机上运行这个吗?
  • 你知道如何检查错误日志,甚至在浏览器中启用错误检查吗?
  • 我建议您在生产中使用此代码之前研究“SQL 注入”。
  • 嗨,Jake,我知道 ini 文件的路径,即 /usr/local/lib/php.ini。我是否只需将该文件复制到我的根目录以启用错误检查?
  • 嗨,乔迪,是的,我在 Godaddy 网络服务器上运行 localhost。我确实阅读了有关 SQL 注入的信息。不用担心使用现场环境,因为我现在做这一切只是为了学习而不担心黑客攻击。什么是替代方案?妈妈?

标签: php mysql phpmailer


【解决方案1】:

遗憾的是,正如其他人所指出的那样,您的代码有很多问题。

  • 您在知道用户是否存在之前就创建了一条消息。
  • 您容易受到 SQL 注入的攻击。
  • 你没有发送消息(没有给$mail-&gt;send();打电话)
  • 您使用的是旧版本的 PHPMailer。
  • 您正在构建的消息包含用户名和密码 提交的用户,而不是您从数据库中获得的用户名和密码。
  • 我希望您不要将密码以纯文本形式保存在数据库中!
  • 空白屏幕通常意味着 PHP 错误 - 请致电 ini_set('display_errors', true);

一般来说,您是在重新发明轮子,并且在此过程中收获不多。如果你真的想要一个有效的身份验证系统(这不仅仅是一个编码练习),我建议你看看php login project

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2010-09-07
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多