生成随机密码并发送到PHP中的电子邮件

时间:2014-02-10 07:45:44

标签: php mysql

当您在我的网站上注册时,您的密码是使用$ hashedPass = md5($ password);.

存储的。

以下代码是我忘记的密码:

问题是:它重定向到拒绝页面。

朋友们,我可能知道我在下面的代码中犯了什么错误 请帮帮我朋友

<?php
session_start();  // Start Session
//Connect to the database through our include 
    include_once "connect_to_mysql.php";
session_register("session");
// This is displayed if all the fields are not filled in
$empty_fields_message = "<p>Please go back and complete all the fields in the form.</p>Click <a class=\"two\" href=\"javascript:history.go(-1)\">here</a> to go back";
// Convert to simple variables  
$email = $_POST['email'];
if (!isset($_POST['email'])) {

?>
       <?php
}
elseif (empty($email)) {
    echo $empty_fields_message;
}
else {
$email=mysql_real_escape_string($email);
$status = "OK";
$msg="";
//error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$msg="Your email address is not correct<BR>"; 
$status= "NOTOK";}

echo "<br><br>";
if($status=="OK"){  $query="SELECT email,username FROM members WHERE email = '$email'";
$st=mysql_query($query);
$recs=mysql_num_rows($st);
$row=mysql_fetch_object($st);
$em=$row->email;// email is stored to a variable
 if ($recs == 0) {
//Redirect to denied page.
 print "<script language='Javascript'>document.location.replace('forgotenpass_denied.php');</script>";
}
function makeRandomPassword() { 
          $salt = "abchefghjkmnpqrstuvwxyz0123456789"; 
          srand((double)microtime()*1000000);  
          $i = 0; 
          while ($i <= 7) { 
                $num = rand() % 33; 
                $tmp = substr($salt, $num, 1); 
                $pass = $pass . $tmp; 
                $i++; 
          } 
          return $pass; 
    } 
    $random_password = makeRandomPassword();  
    $password = md5($random_password); 

    $sql = mysql_query("UPDATE members SET password='$password'  WHERE email='$email'"); 

     $to = "$email";
    // Change this to your site admin email
    $from = "geetha.victor@tryteksolutions.com";
    $subject = "Your Password Has been reset"; 
    $message = "Hi, we have reset your password. 

    Your New Password is: $random_password 

    http://www.trytek.tryteksolutions.co.in/login.php
    Once logged in you can change your password 

    Thanks! 
    Admin 

    This is an automated response, DO NOT REPLY!"; 

   $headers = "From: $from\r\n";
        $headers .= "Content-type: text/html\r\n";
        $to = "$to";
        // Finally send the activation email to the member
        mail($to, $subject, $message, $headers);
    print "<script language='Javascript'>document.location.replace('forgotenpass_sucess.php');</script>"; 
 } 
 else {echo "<center><font face='Verdana' size='2' color=red >$msg <br><br><input type='button' value='Retry' onClick='history.go(-1)'></center></font>";}
}
?>

3 个答案:

答案 0 :(得分:2)

这里有很多错误,我几乎不知道从哪里开始。

  1. mysql_num_rows()所述:

      

    返回值

         

    成功时结果集中的行数或失败时FALSE

    正如PHP type comparison tables所述,FALSE == 0是真的。因此,即使$recs == 0失败,布尔表达式TRUE也会计算为mysql_num_rows()。您必须使用严格比较$recs === 0来确保它的值只有TRUE时才会计算为mysql_query($query) or die(mysql_error());

    您还应该检查函数调用是否失败,如果是,则执行适当的错误处理。例如:

    mysql_query()
  2. 如上所述,正如"/([\w\-]+\@[\w\-]+\.[\w\-]+)/"

    所述
      

    警告

         

    自PHP 5.5.0起,此扩展程序已弃用,将来将被删除。相反,应使用MySQLiPDO_MySQL扩展名。有关详细信息,另请参阅MySQL: choosing an API指南和related FAQ。该功能的替代方案包括:

         
  3. Strings所述:

      

    双引号

         

    如果字符串用双引号(“)括起来,PHP将解释特殊字符的更多转义序列:

    ╔════════════════════╦═══════════════════════════════════════════════════════════════════════════════════════════════════╗
    ║      Sequence      ║                                              Meaning                                              ║
    ╠════════════════════╬═══════════════════════════════════════════════════════════════════════════════════════════════════╣
    ║ \n                 ║ linefeed (LF or 0x0A (10) in ASCII)                                                               ║
    ║ \r                 ║ carriage return (CR or 0x0D (13) in ASCII)                                                        ║
    ║ \t                 ║ horizontal tab (HT or 0x09 (9) in ASCII)                                                          ║
    ║ \v                 ║ vertical tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)                                         ║
    ║ \e                 ║ escape (ESC or 0x1B (27) in ASCII) (since PHP 5.4.0)                                              ║
    ║ \f                 ║ form feed (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)                                            ║
    ║ \\                 ║ backslash                                                                                         ║
    ║ \$                 ║ dollar sign                                                                                       ║
    ║ \"                 ║ double-quote                                                                                      ║
    ║ \[0-7]{1,3}        ║ the sequence of characters matching the regular expression is a character in octal notation       ║
    ║ \x[0-9A-Fa-f]{1,2} ║ the sequence of characters matching the regular expression is a character in hexadecimal notation ║
    ╚════════════════════╩═══════════════════════════════════════════════════════════════════════════════════════════════════╝
    
         

    与单引号字符串一样,转义任何其他字符也会导致反斜杠被打印。

    因此,您的字符串\w依赖于\-\@\.if (!preg_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",$email)) { 不是有效的双引号字符串转义序列的事实。您至少应该转义反斜杠,以便将它们显式包含在正则表达式中:

    @

    也就是说,由于[\w\-]不是PCRE meta-character,因此实际上不需要转义。

    此外,字符类$row=mysql_fetch_object($st); $em=$row->email;// email is stored to a variable 包含字母,数字,下划线和连字符:这不足以匹配电子邮件地址 - 查看some examples of valid email addresses以查看原因;实际上,正则表达式cannot be used用于验证电子邮件地址(一个应该使用解析器)。

    但是,在您的情况下,我不明白为什么有必要验证电子邮件地址 - 只需直接在您的数据库中查找。

  4. md5()所述:

      

    注意:安全密码哈希

         

    由于此散列算法的快速性,建议不要使用此功能来保护密码。有关详细信息,请参阅here

  5. 其他人已经观察到您可以(也可能应该)使用HTTP标头而不是JavaScript重定向。

  6. 还有很多其他奇怪之处:<​​/ p>

    $em

    目前尚不清楚为什么这样做:毕竟,$email中的$to = "$email"; 值已经为$to = $email。另外,请记住,您的查询可能返回了多条记录,而这只会获取第一条记录。

    $email

    为什么不只是mail()(或者确实只是直接使用$to = "$to"; 作为$status = "OK"; $status= "NOTOK"; if($status=="OK") 函数调用的第一个参数)?您需要PHP进行不必要的解析才能执行简单的分配。就此而言,您在整个代码中使用双引号字符串文字,其中单引号文字(具有较少的解析开销并保护您不会意外包括未转义的变量)就足够了。

    <center>

    我不知道这行代码的目的是什么。

    <font>

    为什么不使用布尔值而不是字符串比较?

  7. 在这一天&amp;年龄,一个真的应该使用CSS而不是{{1}},{{1}}等。

答案 1 :(得分:0)

也许尝试使用

的完整服务器路径
print "<script language='Javascript'>document.location.replace('forgotenpass_denied.php');</script>";

print "<script language='Javascript'>document.location.replace('forgotenpass_sucess.php');</script>";

而不是使用

document.location.replace('forgotenpass_denied.php')

尝试

document.location.replace('/home/xxxxx/www/forgotenpass_denied.php')

答案 2 :(得分:0)

问题显然出现在这个街区:

$query="SELECT email,username FROM members WHERE email = '$email'";
$st=mysql_query($query);
$recs=mysql_num_rows($st);
$row=mysql_fetch_object($st);
$em=$row->email;// email is stored to a variable
 if ($recs == 0) {
//Redirect to denied page.
 print "<script language='Javascript'>document.location.replace('forgotenpass_denied.php');</script>";
}

更具体地说,问题是您的查询返回0条记录(或FALSE出错)。不幸的是,我的水晶球出了故障,所以我不能告诉你为什么。不过,这里有一些要验证的事情:

  • 您是否有可用的数据库连接?
  • 查询中的表/字段名称是否与数据库架构匹配?
  • $email中确实存在members