当您在我的网站上注册时,您的密码是使用$ 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>";}
}
?>
答案 0 :(得分:2)
这里有很多错误,我几乎不知道从哪里开始。
如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()
如上所述,正如"/([\w\-]+\@[\w\-]+\.[\w\-]+)/"
:
警告
自PHP 5.5.0起,此扩展程序已弃用,将来将被删除。相反,应使用MySQLi或PDO_MySQL扩展名。有关详细信息,另请参阅MySQL: choosing an API指南和related FAQ。该功能的替代方案包括:
如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用于验证电子邮件地址(一个应该使用解析器)。
但是,在您的情况下,我不明白为什么有必要验证电子邮件地址 - 只需直接在您的数据库中查找。
如md5()
所述:
注意:安全密码哈希
由于此散列算法的快速性,建议不要使用此功能来保护密码。有关详细信息,请参阅here。
其他人已经观察到您可以(也可能应该)使用HTTP标头而不是JavaScript重定向。
还有很多其他奇怪之处:</ p>
$em
目前尚不清楚为什么这样做:毕竟,$email
中的$to = "$email";
值已经为$to = $email
。另外,请记住,您的查询可能返回了多条记录,而这只会获取第一条记录。
$email
为什么不只是mail()
(或者确实只是直接使用$to = "$to";
作为$status = "OK";
$status= "NOTOK";
if($status=="OK")
函数调用的第一个参数)?您需要PHP进行不必要的解析才能执行简单的分配。就此而言,您在整个代码中使用双引号字符串文字,其中单引号文字(具有较少的解析开销并保护您不会意外包括未转义的变量)就足够了。
<center>
我不知道这行代码的目的是什么。
<font>
为什么不使用布尔值而不是字符串比较?
在这一天&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
?