-1

我忘记的密码没有更新令牌表,也没有在更改时更新密码,它不断回显下面的错误消息是表单代码:

Forgot Password</strong></h3>
      <form name="forgot" method="POST" id="forgot" action="includes/reset.php">
        <div align="center">
          <table width="372" border="0">
            <tr>
              <td width="181"><p>&nbsp;</p>
                <p><strong>Password</strong></p></td>
              <td width="181"><span id="sprytextfield1"><br />
                <label for="label"></label>
                <input type="password" name="passsowrd" id="password" />
                <span class="textfieldRequiredMsg">Your password is required</span></span></td>
</tr>
            <tr>
              <td><p>&nbsp;</p>
                <p><strong>Confenter code hereirm Password</strong></p></td>
              <td><span id="spryconfirm2">
                <label for="password"></label>
                <input type="password" name="password2" id="password" />
                <span class="confirmRequiredMsg">A value is required.</span><span class="confirmInvalidMsg">The values don't match.</span></span></td>
</tr>
</table>
</div>
    <div align="center">
      <p>&nbsp;</p>
      <table width="98" border="0">
        <tr>
          <th width="44" scope="row"><input type="submit" name="submit" id="submit" value="submit" /></th>
          <th width="44" scope="row"><input type="reset" name="clear" id="clear" value="Clear" /></th>
        </tr>
      </table>
    </div>
    <div align="center">
      <table width="372" border="0">
        <tr> </tr>
        <tr> </tr>
      </table>
    </div>
  </form>

reset.php 是:

<?php
session_start();
error_reporting(0);
$token=$_GET['token'];
include("settings.php");
connect();
if(!isset($_POST['password'])){
$q="select email from tokens where token='".$token."' and used=0";
$r=mysql_query($q);
while($row=mysql_fetch_array($r))
   {
$email=$row['email'];
   }
If ($email!=''){
          $_SESSION['email']=$email;
}
else die("Invalid link or Password already changed  <a href='../index.php'>Click here to go back to the HOME PAGE<a/>");}

$pass=$_POST['password'];
$email=$_SESSION['email'];

if(isset($_POST['password'])&&isset($_SESSION['email']))
{
$q="update registration set password='".md5($pass)."' where email='".$email."'";
$r=mysql_query($q);
if($r)mysql_query("update tokens set used=1 where token='".$token."'");echo "Your password is changed successfully  <a href='../index.php'>Click here to go back to the HOME PAGE<a/>";
if(!$r)echo "An error occurred";
    }

所以问题是始终回显以下错误消息:无效链接或密码已更改。

如果我添加,我应该怎么做:

if(!isset($pass)){
echo '<form method="post">
enter your new password:<input type="password" name="password" />
<input type="submit" value="Change Password">
</form>
';} 

然后它可以工作,但在新的空白页面中打开它,这是不专业的,你正在尝试将它添加到 html

4

4 回答 4

0

你关闭你的while街区太快了。移动}下面的die

于 2013-05-22T23:23:50.593 回答
0

我打算编辑你的帖子,但是有太多的格式和语法问题,我会把它作为答案发布。

<?php
    session_start();
    error_reporting(0);

    include 'settings.php';
    connect();

    $token = $_GET['token'];
    $pass = $_POST['password'];

    if (isset($pass) && isset($token)) {
       $q = 'SELECT email FROM tokens WHERE token=' . $token . ' AND used=0';
       $r = mysql_query($q);

       while ($row = mysql_fetch_array($r)) {
            $email = $row['email'];
        }

        if ($email != '') {
            $_SESSION['email'] = $email; // Why?

            $q = 'UPDATE registration SET password=' . md5($pass). ' WHERE email=' . $email;
            $r = mysql_query($q);

            if ($r) {
                mysql_query('UPDATE tokens SET used=1 WHERE token=' . $token);
                echo 'Your password is changed successfully <a href="../index.php">Click here to go back to the HOME PAGE<a/>';
            } else {
                echo 'An error occurred';
            }
        } else {
            die('Invalid link or Password already changed  <a href="../index.php">Click here to go back to the HOME PAGE<a/>');
        }
    }

这会让你走上正轨,请注意制表符、花括号,最重要的是,在编写代码时保持一致。坚持使用单引号双引号,即使在单行 if/else 语句中也始终使用大括号。

但是,正如其他人所说,此代码仍然高度不安全且已弃用,但它应该可以工作。

于 2013-05-22T23:16:02.183 回答
0

else die在完全错误的地方。你总是会死,因为当循环结束时,while 总是会评估为 false。

如果您的意图是在查询失败时死掉,您应该执行以下操作:

$r = mysql_query($q);

if (false === $r) {
    die(mysql_error());
}

while ($row = mysql_fetch_array($r)) {
   ...
}

当然,我的一般建议是根本不要使用 mysql 函数,因为 PHP 5.5 已弃用它们。您还应该确保为您的查询明确处理所有可能的结果并记录有意义的错误以帮助您进行调试。

于 2013-05-22T22:42:38.010 回答
0

您提供的代码中没有传递任何令牌

$token=$_GET['token']; 

脚本中的令牌来自哪里,它不是从数据库中调用它,

$q="select email from tokens where token='".$token."' and used=0";

你也没有防范任何 sql 注入,这确实应该得到解决,除非我错过了将令牌发送到重置页面的代码部分,如果是这样,我很抱歉

$r=mysql_query($q);
while($row=mysql_fetch_array($r))
   {
$email=$row['email'];
   }
If ($email!=''){
          $_SESSION['email']=$email;
}
else die

向下运行您的代码,您运行查询以选择令牌为空白的电子邮件,我假设没有返回任何电子邮件,因此如果电子邮件不为空白,请执行此操作,否则死...它必须死,因为 $email 为空白

于 2013-05-22T22:44:27.483 回答