Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过表单和唯一代码重置密码_Php_Mysql_Passwords - Fatal编程技术网

Php 通过表单和唯一代码重置密码

Php 通过表单和唯一代码重置密码,php,mysql,passwords,Php,Mysql,Passwords,我有一个小规模的应用程序,允许管理员重置他们的密码。我目前有它,以便管理员将输入他们的电子邮件地址,它会生成一个随机密钥,并通过电子邮件发送给他们。随机密钥也为用户存储在数据库中。该电子邮件还包含一个表单链接,用户可以通过输入用户名和发送给他们的代码来重置密码 以下是重置密码表单: <h1>Reset Your Password</h1> <form id="reset" name="reset" method="post" action="reset-admin

我有一个小规模的应用程序,允许管理员重置他们的密码。我目前有它,以便管理员将输入他们的电子邮件地址,它会生成一个随机密钥,并通过电子邮件发送给他们。随机密钥也为用户存储在数据库中。该电子邮件还包含一个表单链接,用户可以通过输入用户名和发送给他们的代码来重置密码

以下是重置密码表单:

<h1>Reset Your Password</h1>

<form id="reset" name="reset" method="post" action="reset-admin-password-exec.php">
<table width="365" height="147" border="0" cellpadding="0" cellspacing="5">
  <tr>
    <td width="144">Username: </td>
    <td><input name="username" type="text" class="textfield" id="username" /></td>
  </tr>
  <tr>
    <td>Code: </td>
    <td><input name="code" type="text" class="textfield" id="code" /></td>
  </tr>
  <tr>
    <td>New Password: </td>
    <td><input name="password" type="password" class="textfield" id="code" /></td>
  </tr>
  <tr>
    <td>Confirm Password: </td>
    <td><input name="cpassword" type="password" class="textfield" id="cpassword" /></td>
  </tr>
  <tr>
    <td><input type="submit" name="Submit" value="Reset" /></td>    
  </tr>
</table>
</form>
重置密码
用户名:
代码:
新密码:
确认密码:
下面是处理代码的reset-admin-password-exec.php文件:

<?
    //Array to store validation errors
    $errmsg_arr = array();

    //Validation error flag
    $errflag = false;


    //Function to sanitize values received from the form. Prevents SQL injection
    function clean($str) {
        $str = @trim($str);
        if(get_magic_quotes_gpc()) {
            $str = stripslashes($str);
        }
        return mysql_real_escape_string($str);
    }

    //check for validation errors
    if (isset ($_POST['username']) && !empty ($_POST['username'])) {
    $username = clean($_POST['username']);
    } else {
        $errmsg_arr[] = 'username do not match';
        $errflag = true;
    }

    if (isset ($_POST['code']) && !empty ($_POST['code'])) {
    $code = clean($_POST['code']);
    } else {
        $errmsg_arr[] = 'code do not match';
        $errflag = true;
    }

    if (isset ($_POST['password']) && !empty ($_POST['password'])) {
    $password = clean($_POST['password']);
    } else {
        $errmsg_arr[] = 'first do not match';
        $errflag = true;
    }

    if (isset ($_POST['cpassword']) && !empty ($_POST['cpassword'])) {
    $cpassword = clean($_POST['cpassword']);
    } else {
        $errmsg_arr[] = 'second do not match';
        $errflag = true;
    }

    //Check that both password match
    if( strcmp($password, $cpassword) != 0 ) {
        $errmsg_arr[] = 'Passwords do not match';
        $errflag = true;    
    }


    //encrypt the password
    $salt1 = md5($username);
    $salt2 = md5(DB_PASSWORD);
    $password = sha1($salt1.$password.$salt2);


    //if there are input validations redirect back to main page
    if($errflag) {
        $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
        session_write_close();
        header("location: reset-admin-password-form.php");
        exit();
    }

    $qry = "        UPDATE  admins
                    SET password    =   '$password'
                    WHERE   randkey     =   '$code'
                                    AND     username        =       '$username'";

    $result = mysql_query($qry);

    if($result) {
        echo $result;
        //header("location: reset-admin-password-success.php");
        exit();
    }else {
        die(mysql_error());

    }

?>

您确定查询确实有效吗?它可能没有输出任何错误,但这并不意味着它实际上在更新任何行

利用;此函数将告诉您是否实际更新了任何行(即
WHERE
子句是否匹配)

您应该将代码的最后一部分更改为:

$rows = mysql_affected_rows();
if( $rows == 1 ) {
    header("location: reset-admin-password-success.php");
    exit();
}
else {
    if( $rows == 0 ) {
        $_SESSION['ERRMSG_ARR'] = array('Your username and code do not match');
    } else {
        $_SESSION['ERRMSG_ARR'] = array('Unknown error');
    }
    session_write_close();
    header("location: reset-admin-password-form.php");
    exit();
}

您确定该查询确实有效吗?它可能没有输出任何错误,但这并不意味着它实际上在更新任何行

利用;此函数将告诉您是否实际更新了任何行(即
WHERE
子句是否匹配)

您应该将代码的最后一部分更改为:

$rows = mysql_affected_rows();
if( $rows == 1 ) {
    header("location: reset-admin-password-success.php");
    exit();
}
else {
    if( $rows == 0 ) {
        $_SESSION['ERRMSG_ARR'] = array('Your username and code do not match');
    } else {
        $_SESSION['ERRMSG_ARR'] = array('Unknown error');
    }
    session_write_close();
    header("location: reset-admin-password-form.php");
    exit();
}

请注意,通过电子邮件发送的代码与密码是等效的,还应进行哈希和盐析。此外,正如PHP手册中针对函数所述:不鼓励使用此扩展。相反,应该使用or扩展名。有关更多信息,请参见指南和。但是,当您使用古老的
mysql\u*
扩展时,您可能应该进行测试,因为
mysql\u query()
即使没有匹配的行也会成功(更新
命令中没有错误)。请注意,通过电子邮件发送的代码与密码等效,并且还应进行哈希和盐析。此外,正如PHP手册中针对函数所述:不鼓励使用此扩展名。相反,应该使用or扩展名。有关更多信息,请参见指南和。但是,当您使用古老的
mysql\u*
扩展时,您可能应该进行测试,因为
mysql\u query()
即使没有匹配的行也会成功(更新
命令中没有错误).我用您建议的代码替换了最后一位代码,即使没有正确的代码,它仍在运行。我替换了
标题(“location:reset admin password success.php”)带有
printf(mysql_-infected_-rows())
并得到一个
-1
,这意味着查询完全失败。我在您粘贴的示例中没有看到任何语法错误,您确定列名和所有内容拼写正确吗?您是否正在更新正确的表(例如,管理员而不是用户)?您是否创建了MySQL连接并选择了正确的数据库?我用您建议的代码替换了最后一段代码,即使没有正确的代码,它仍在运行。我替换了
标题(“location:reset admin password success.php”)带有
printf(mysql_-infected_-rows())
并得到一个
-1
,这意味着查询完全失败。我在您粘贴的示例中没有看到任何语法错误,您确定列名和所有内容拼写正确吗?您是否正在更新正确的表(例如,管理员而不是用户)?您是否创建了MySQL连接并选择了正确的数据库?