2017-04-01 56 views
-1

这几天我有一个严重的问题密码恢复程序。当我在reset.php?recoverykey=6602f445b4736ef3363a31e05750022d上编程if(isset($_POST['pass-submit']))。当有人点击表单的提交按钮时,它应该保持在同一页面进行处理,即在reset.php?recoverykey=6602f445b4736ef3363a31e05750022d。但是相反,我们需要reset.php,因为变量recoverykey为空,所以代码无法工作。即使使用header("Location: reset.php?recoverykey=$recovery_code");后,也没有任何工作。 我希望它保持在它的位置,即使点击提交按钮后,PHP可以根据程序检查密码和确认密码字段是否相同或不正确。

这是我在reset.php所有代码:

<?php 
 
    ob_start(); 
 
    session_start(); 
 
?> 
 
<!DOCTYPE html> 
 
      <head> 
 
       <meta name="robots" content="noindex" /> 
 
       <link rel="stylesheet" type="text/css" href="assets/scripts/css/styles.css" /> 
 
       <title>Reset Password</title> 
 
      </head> 
 
<?php 
 
    include('db-config.php'); 
 
    function show_change_pass_form(){ 
 
     ?> 
 
       <form class="iqform" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" autocomplete="off"> 
 
        <h3>Change your Password</h3> 
 
        <label><span class="text-danger"><?php echo $passError ?></span><input type="password" placeholder="New Password" name="new-pass" required /></label> 
 
        <label><span class="text-danger"><?php echo $Con_passError; ?></span><input type="password" placeholder="Confirm Password" name="confirm-new-pass" required /></label> 
 
        <input type="submit" value="Change Password" name="pass-submit" /> 
 
       </form> 
 
     <?php 
 
    } 
 
    $recovery_code = $_GET['recoverykey']; 
 
    if(empty($recovery_code)){ 
 
     echo 'Looks like you landed elsewhere.'; 
 
    } 
 
    $sql = "SELECT * FROM RegisteredMembers WHERE RecoveryCode='$recovery_code'"; 
 
    $result = mysql_query($sql); 
 
    if($result){ 
 
     $count = mysql_num_rows($result); 
 
     if($count==1){ 
 

 
      if(isset($_POST['pass-submit'])){ 
 

 
       header("Location: reset.php?recoverykey=$recovery_code"); 
 

 
       $pass = $_POST['new-pass']; 
 
       $Con_pass = $_POST['confirm-new-pass']; 
 

 
        // Confirmation 
 
         if($pass==$Con_pass){ 
 
          $sql1 = "UPDATE RegisteredMembers SET password = '$pass' WHERE RecoveryCode = '$recovery_code'"; 
 
          $output = mysql_query($sql1); 
 
          echo $output; 
 
          $error = false; 
 
          $passError = "Password successfully changed. Feel free to Log In."; 
 
         } else if(!($pass==$Con_pass)){ 
 
          $error = true; 
 
          $Con_passError = "The Password isn't matching. Be sure you remember the New Password."; 
 
         } else if(empty($pass)){ 
 
          $error = true; 
 
          $passError = "Please do not keep the password empty."; 
 
         } else if(empty($Con_pass)){ 
 
          $error = true; 
 
          $Con_passError = "Please do not keep this field empty."; 
 
         } 
 
      } 
 
      show_change_pass_form(); 
 

 
     } else if($count==0) { 
 
      echo "No such recovery code, please don't try Spamming around!"; 
 
     } 
 
    } 
 
?> 
 
<?php ob_end_flush(); ?>

这是我在forget.php代码(我加了它,虽然它没有太大的必要):

<?php 
 

 
    ob_start(); 
 
    session_start(); 
 
    include('db-config.php'); 
 

 
    if(isset($_POST['forgot-submit'])){ 
 
     $recovery_user = $_POST['forgot-email']; 
 
     $query = "SELECT * FROM RegisteredMembers WHERE userEmail='$recovery_user'"; 
 
     $output = mysql_query($query); 
 
     $count = mysql_num_rows($output); 
 
     $row = mysql_fetch_array($output); 
 
     if($count==1){ 
 
      $error = false; 
 

 
      // Mail the Recovery link 
 
      $recovery_code = md5(uniqid(rand())); 
 
      $mTo = $recovery_user; 
 
      $mFrom = 'From: '.$website_details['name'].' Team '.'<'.$website_details['email'].'>'; 
 
      $mSubject = $website_details['name']." Account recovery Mail"; 
 
       // Message 
 
       $mMsg[0] = "Hi ".$row['fname'].", \r\n"; 
 
       $mMsg[1] = "This is the password recovery email which you have requested just few minutes before. <b>(If you havn't requested, you may kindly ingnore this Email)</b>"; 
 
       $mMsg[2] = "Here's your <a href='$web_path/reset.php?recoverykey=$recovery_code'>Password Recovery Link</a>. Clicking it would allow you to change your existing password into a new one."; 
 
       $mFinMsg = $mMsg[0].$mMsg[1].$mMsg[2]; 
 
      $sendRecMail = mail($mTo , $mSubject , $mFinMsg , $mFrom); 
 

 
      // Add recovery code to Database 
 
      $mysql = "UPDATE RegisteredMembers SET RecoveryCode='$recovery_code' WHERE userEmail='$recovery_user'"; 
 
      $result = mysql_query($mysql); 
 
      if($result){ 
 
       $error = false; 
 
       $forgotEmailMsg = "Thanks, Check your Email for recovering your password."; 
 
      } else{ 
 
       echo "Looks like there's a Disturbance and Load on server. Try again later."; 
 
      } 
 
     } else if(strlen($recovery_user)==0){ 
 
      $error = true; 
 
      $forgotEmailMsg = "Please do not leave this field empty."; 
 
     } else{ 
 
      $error = true; 
 
      $forgotEmailMsg = "No such Email found in Database."; 
 
     } 
 
    } 
 

 
?> 
 
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
     <meta name="robots" content="noindex" /> 
 
     <link rel="stylesheet" type="text/css" href="assets/scripts/css/styles.css" /> 
 
     <title>Password Recovery</title> 
 
    </head> 
 
    <body> 
 
     <form class="iqform" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" autocomplete="off"> 
 
      <h3>Password Recovery</h3> 
 
      <label><span class="text-danger"><?php echo $forgotEmailMsg; ?></span><input type="email" placeholder="Your registered Email" name="forgot-email" required /></label> 
 
      <input type="submit" value="Next" name="forgot-submit" /> 
 
     </form> 
 
    </body> 
 
</html> 
 
<?php ob_end_flush(); ?>

Forget.php都可以,但可能是你可以从中引用一些东西。

+0

*** STOP *** [using'MySQL_' functions。](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php) – Martin

回答

0

嗯,我不认为你需要使用头功能重定向用户。在reset.php,在形式的行动,应更换:

<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?> 

有:

<?php echo $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING']; ?> 

PHP_SELF只返回脚本的名称,但没有查询字符串,所以你的页面不会有recoverykey场在网址中。

你不应该使用mysql_ *函数,因为PHP,MySQL扩展已被弃用,从PHP 7

而且ob_start(),ob_end_flush()函数,并在session_start(已被删除)没有需要reset.php

+0

'PHP_SELF只返回错误的脚本名称,PHP_SELF返回正在运行的任何文件的URL给定标识符,因此不安全并可能被最终用户滥用。不应该使用'PHP_SELF',还有其他更好的'$ _SERVER'值,比如'$ _SERVER ['SCRIPT_FILENAME']'等等。 – Martin

+0

嘿天底,谢谢,真的为我工作。 –

-1
if(isset($_POST['submit'])){ 
     header("Location:https://www.example.com/subname/"); 
     exit; // Exit should always be called after a redirection to 
       // cease further PHP code execution. 
    } 

提交后使用此代码进行rediect。

+0

This didn没有工作。我不希望它重定向。我想让它呆在那里。 –

+1

他们你想用阿贾克斯。 –