【问题标题】:Forgot Password Script PHP mysqli database忘记密码脚本 PHP mysqli 数据库
【发布时间】:2013-12-18 08:40:22
【问题描述】:

您好,我正在尝试制作忘记密码脚本并成功完成,但我遇到了一个问题。在forgot.php中,当用户输入电子邮件时,脚本会检查数据库中的电子邮件是否匹配,然后它将激活码保存在数据库中,并将激活码发送到他的电子邮件地址。

收到电子邮件后点击链接,他会在resetpass.php中重置密码表格首先检查激活码是否与数据库中的代码匹配,如果是,那么用户将输入他的新密码,它会重置他的密码,但问题是密码没有改变谁输入了他的电子邮件,它改变了其他人的密码:D。我不知道这个脚本出了什么问题

Forgot.php

<?php 
error_reporting(0);
if($_POST['submit']=='Send')
{
//keep it inside
$email=$_POST['email'];
$code = $_GET['activation_code'];
$con=mysqli_connect("Localhost","root","123","user");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
$query = mysqli_query($con,"select * from login where user_email='$email'")
or die(mysqli_error($con)); 

 if (mysqli_num_rows ($query)==1) 
 {
$code=rand(100,999);
$message="You activation link is: http://bing.fun2pk.com/resetpass.php?email=$email&code=$code";
mail($email, "ZatWing", $message);
echo 'Email sent';
$query2 = mysqli_query($con,"update login set activation_code='$code' where user_email='$email' ")
or die(mysqli_error($con)); 
}
else
{
echo 'No user exist with this email id';

}}

?>
<form action="forgot.php" method="post">
Enter you email ID: <input type="text" name="email">
<input type="submit" name="submit" value="Send">
</form>

resetpass.php

<?php
if(isset($_GET['code'])) {

    $acode = $_GET['code'];}
    echo $acode;

if(isset($_POST['pass'])){
    $pass = $_POST['pass'];


$con=mysqli_connect("xxx","xxx","xxx","xxx");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
$query = mysqli_query($con,"select * from login where activation_code='$acode'")
or die(mysqli_error($con)); 

 if (mysqli_num_rows ($query)==1) 
{



$query3 = mysqli_query($con,"update login set Password='$pass' where activation_code='$acode'")
or die(mysqli_error($con)); 

echo 'Password Changed';
}
else
{
echo 'Wrong CODE';

}}

?>

    <form action="resetpass.php" method="POST">
    <p>New Password:</p><input type="password" name="pass" />
    <input type="submit"  name="submit" value="Signup!" />
    </form>

【问题讨论】:

  • Forgot.php 中的内容是什么,$code = $_GET['activation_code']; ??我猜你正在生成随机代码:$code=rand(100,999);
  • $code=rand(100,999); 那么什么会阻止任何人通过使用脚本运行所有可能性来清除/更改您的所有密码?另外,您现在已经向互联网提供了登录详细信息mysqli_connect("mysql.3gwebhosters.com","u777946695_root","melody,123","u777946695_user");,可能需要更改它们。
  • 你可以使用 mysql_real_escape_string() 来防止 SQL 注入攻击 :)
  • @Ravi mysql_real_escape_string() 与SQL注入攻击无关
  • @Ravi 不管它在这里是否相关,你还是想使用mysqli_real_escape_string,因为mysql* 命令已被弃用。

标签: php mysql email mysqli


【解决方案1】:

我在resetpass.php 中遇到了一个错误

您首先必须使用$_GET['code'] 来获取您的激活码并存储在

的隐藏字段中

这是修改后的代码,应该可以工作。

<?php

if(isset($_POST['pass'])){
$pass = $_POST['pass'];
$acode=$_POST['code'];

$con=mysqli_connect("xxx","xxx","xxx","xxx");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$query = mysqli_query($con,"select * from login where activation_code='$acode'")
or die(mysqli_error($con)); 

if (mysqli_num_rows ($query)==1) 
{
$query3 = mysqli_query($con,"update login set Password='$pass' where activation_code='$acode'")
or die(mysqli_error($con)); 

echo 'Password Changed';
}
else
{
echo 'Wrong CODE';
}
}
?>

<form action="resetpass.php" method="POST">
<p>New Password:</p><input type="password" name="pass" />
<input type="submit"  name="submit" value="Signup!" />
<input type="hidden" name="code" value="<?php echo $_GET['code'];?>" />
</form>

【讨论】:

    【解决方案2】:

    您需要将操作从resetpass.php 更改为resetpass.php?code=&lt;?php echo $_GET['code'];?&gt;

    否则提交表单时代码会丢失。

    例如:(不是没有错误的!)

    <?php
    if(isset($_GET['code'])) $acode = $_GET['code'];
    else die("No code!");
    
    $con=mysqli_connect("xxx","xxx","xxx","xxx");
    // Check connection
    if (mysqli_connect_errno()) {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
    } else {
        $acode = mysqli_real_escape_string($con, $acode);
        $query = mysqli_query($con,"select * from login where activation_code='$acode'")
        or die(mysqli_error($con)); 
        if(mysqli_num_rows($query) == 0) {
            echo "Wrong code";
            die();
        } elseif (mysqli_num_rows ($query)==1 && isset($_POST['pass'])) {
            $pass = mysqli_real_escape_string($con, $_POST['pass']);
            $query3 = mysqli_query($con,"update login set Password='$pass' where activation_code='$acode'")
            or die(mysqli_error($con)); 
    
            echo 'Password Changed';
        }
    }
    
    ?>
    
        <form action="resetpass.php?code=<?php echo $_GET['code'];?>" method="POST">
        <p>New Password:</p><input type="password" name="pass" />
        <input type="submit"  name="submit" value="Signup!" />
        </form>
    

    但是想想一些事情:

    • 您的代码非常不安全,最好试试 uniqid(rand());
    • 使用此代码,两个条目可能获得相同的代码
    • 有人可以尝试所有代码可能性

    【讨论】:

      【解决方案3】:
      <?php
      if(isset($_GET['code'])) $acode = $_GET['code'];
      else die("No code!");
      
      $con=mysqli_connect("xxx","xxx","xxx","xxx");
      // Check connection
      if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
      } else {
          $acode = mysqli_real_escape_string($con, $acode);
          $query = mysqli_query($con,"select * from login where activation_code='$acode'")
          or die(mysqli_error($con)); 
          if(mysqli_num_rows($query) == 0) {
              echo "Wrong code";
              die();
          } elseif (mysqli_num_rows ($query)==1 && isset($_POST['pass'])) {
              $pass = mysqli_real_escape_string($con, $_POST['pass']);
              $query3 = mysqli_query($con,"update login set Password='$pass' where activation_code='$acode'")
              or die(mysqli_error($con)); 
      
              echo 'Password Changed';
          }
      }
      
      ?>
      
          enter code here
          <form action="resetpass.php?code=<?php echo $_GET['code'];?>" method="POST">
          <p>New Password:</p><input type="password" name="pass" />
          <input type="submit"  name="submit" value="Signup!" />
          </form>
      

      【讨论】:

      • 一些额外的解释可能会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2014-09-02
      • 2013-08-22
      • 2019-09-23
      • 2015-04-17
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多