PHP - 密码重置表单不起作用

Posted

技术标签:

【中文标题】PHP - 密码重置表单不起作用【英文标题】:PHP - Password Reset form not working 【发布时间】:2016-05-25 20:29:47 【问题描述】:

我找到了一个可用于我的网站的教程密码重置功能,因此我下载了文件并使用了代码。我不太喜欢他们的,所以我几乎把所有的都删了,保留了重要的部分。反正我是从here下载的,可惜现在不行了。

每当我输入电子邮件时,无论它是什么,它都会显示“无效电子邮件”。任何帮助将不胜感激。另外,我是 php 的一个小菜鸟,但我了解这里的所有代码。我的代码如下:

<?php include "base.php"; ?>
 <html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<link rel="stylesheet" href="style.css" type="text/css" />
<link rel="stylesheet" href="style2.css" type="text/css" />
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Forgot Password</title>
</head>
<body>

    <div id="main"><h1>Forgot Password</h1>

    <p>If you forgot your password, please enter the email associated with your account, and we will send you a reset link.</p>

        <form action="" method="post" name="passwd" id="passwd">
        <fieldset>
            <label for="emailadd"><div>Email Address:</div></label><input id="emailid" name="emailid" type="text" placeholder="Your Account's Email"><br>
            <input type="submit" value="Reset Password" />
        </fieldset>
        </form>
        </div>

<?php

    if(!empty($_POST['emailid']))
    
        $emailaddress = mysqli_real_escape_string($_POST['emailid']);
        if (!preg_match("/^[^@]1,64@[^@]1,255$/", $emailaddress))  // Validate email address
       
            echo '<p id="msg"><center>That is an invalid email address. Please try again.</center></p>';
        
        else
        
            $query = "SELECT UserID FROM users where  EmailAddress='".$emailaddress."'";
            $result = mysqli_query($query);
            $Results = mysqli_fetch_array($result);

           if(count($Results)==1)
            
                $encrypt = md5(XXXXXXXXXXXXXXXXXXX);
                echo '<p id="msg"><center>Your password reset link has been sent to your email.</center></p>';
                $to=$emailaddress;
                $subject="Forgot Password";
                $from = 'no-reply@XXXXXXXXXXXX.com';
                $body='Hello, <br/> <br/>Your Membership ID is:   '.$Results['id'].' <br><br>Click <a href="http://XXXXXXXXXXX.com/home/forgot/reset.php?encrypt='.$encrypt.'&action=reset">here</a> to reset your password, or follow the link below:<br><br>http://XXXXXXXXXXXX.com/home/forgot/reset.php?encrypt='.$encrypt.'&action=reset <br/> <br/>--<br>XXXXXXXXXXXX<br>Games, Tools, and so much more!';
                $headers = "From: " . strip_tags($from) . "\r\n";
                $headers .= "Reply-To: ". strip_tags($from) . "\r\n";
                $headers .= "MIME-Version: 1.0\r\n";
                $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

                mail($to,$subject,$body,$headers);

            
            else
            
                echo '<p id="msg"><center>Account not found. Please try again.    </center></p>';
            
        
     elseif(!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Username'])) 

        echo "<meta http-equiv='refresh'              content='0;http://www.XXXXXXXXXXXX.com/home/main.php'/>";

     else 

    
//    include("html.inc"); 
?>

</body>
</html>

附: Base.php 连接到我的数据库,X 代表我的加密或我的网站地址。

提前致谢!

【问题讨论】:

测试它失败了,我看到 3 个选项 其他两个选项在哪里。我看不到他们。 if(!empty($_POST['emailid'])), if (!preg_match("/^[^@]1,64@[^@]1,255$/", $emailaddress)), if(count($Results)==1) 【参考方案1】:

以下功能无法满足您的需求:

mysqli_real_escape_string($_POST['emailid']) mysqli_query($query)

这两个函数都需要将数据库连接传递给它并作为第一个参数。

参考资料:

http://php.net/manual/en/mysqli.real-escape-string.php http://php.net/manual/en/mysqli.query.php

还要确保您确实启动了会话,看到您正在使用它们。

参考:

http://php.net/manual/en/function.session-start.php

脚注:

如果您在该教程链接中注意到您说您关注了http://www.phpgang.com/how-to-create-forget-password-form-in-php_381.html

他们正在向这两个函数传递一个连接:

$encrypt = mysqli_real_escape_string($connection,$_GET['encrypt']);

$result = mysqli_query($connection,$query);

因此,您需要按照该教程达到“T”,这是您没有做过的事情。

这样做,并修改您的数据库以适应该教程的代码和列类型、适当的长度等。

哦,MD5 作为密码散列函数被认为是不安全的。

使用以下方法之一:

CRYPT_BLOWFISH crypt() bcrypt() scrypt() On OPENWALL PBKDF2 PBKDF2 on PHP.net PHP 5.5 的 password_hash() 函数。 兼容包(如果 PHP https://github.com/ircmaxell/password_compat/

其他链接:

PBKDF2 For PHP

关于列长度的重要旁注:

如果您决定使用 password_hash() 或 crypt,请务必注意,如果您当前密码列的长度低于 60,则需要将其更改为该长度(或更高)。手册建议长度为 255。

您需要更改列的长度并使用新的哈希重新开始以使其生效。否则,MySQL 将静默失败。

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:显示错误应该只在暂存阶段完成,而不是在生产阶段。

还有or die(mysqli_error($connection))mysqli_query()

您没有向我们展示的是您用于连接的 MySQL API。

http://php.net/manual/en/function.mysqli-connect.php

“P.S. Base.php 连接到我的数据库,X 代表我的加密或我的网站地址。”

确保您使用 MySQLi API 进行连接,看到您使用的是 mysqli_query() 而不是 mysql_ 或 PDO。

不同的 API 不会混合使用。

请参阅以下内容:

Can I mix MySQL APIs in PHP? http://php.net/manual/en/mysqlinfo.api.choosing.php

您还需要确保邮件可供您使用。

如果不是,那么这超出了这个问题的范围。

变化

mail($to,$subject,$body,$headers);

if(mail($to,$subject,$body,$headers))
   echo "Mail sent";

else 
   echo "Error";

看到“邮件已发送”,意味着mail() 已经完成了它的工作。

如果您看到“错误”,那么您需要找出“为什么”。

再次,“超出范围”的问题。

【讨论】:

谢谢,我会在将其标记为正确之前审核您的编辑,但感谢您的反馈! 你说“用他们的列更新你的数据库”是什么意思? @Blube 我的意思是,使用他们的代码,如图所示。但是,如果您更改了表/列创建代码的列名而不是他们的列名,请确保所有内容都匹配。另外,如果列长度不够长,MySQL 将静默失败。抱歉,我无法在此处添加任何其他内容。 是的,我确实更新了列名等。无论如何,谢谢你的帮助! @Blube 不客气。正如我在回答中所说,您没有将 db 连接参数传递给这两个函数,如我留下的链接所示,以便您了解语法是什么。还要指出的是,如果您与数据库的连接是mysql_ 而不是mysqli_,则不能将mysql_mysqli_ 函数混合使用,正如我所说,这是未知的。我还提供了用于检查 PHP 和 MySQL 错误的方法。使用它,你会看到发生了什么。也可以使用var_dump(); 来查看正在发生的事情。祝你好运。 干杯

以上是关于PHP - 密码重置表单不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 密码重置不起作用

Magento密码重置不起作用

Azure AD B2C 自助服务密码重置链接不起作用 [关闭]

从发送的电子邮件网络核心身份调用重置密码时不起作用

ASP.NET Core 2.2 - 密码重置在 Azure 上不起作用(无效令牌)

MySQL8版本密码重置(老版本skip-grant-tables不起作用,MySQL服务开启之后立马关闭)