2

管理者がパスワードをリセットできる小規模なアプリケーションがあります。現在、管理者がメールアドレスを入力すると、ランダムなキーが生成され、メールで送信されるようになっています。ランダム キーは、ユーザーのデータベースにも格納されます。電子メールには、ユーザーがユーザー名と送信されたコードを入力してパスワードをリセットできるフォームへのリンクも含まれています。

以下はパスワードのリセットフォームです。

<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());

    }

?>

すべての検証が機能し、フィールドが空の場合、またはパスワードが一致しない場合はリダイレクトされます。codeただし、フィールドがテーブルのフィールドと一致しない場合でも、クエリは機能しrandkeyます。randkeys確実に失敗するようにフィールドとして配置しようとしましたが、失敗します。

エコーアウトすると、次の$qryようになります。UPDATE admins SET password = 'b978ac7c458d65ca31c02eb4e7dabd9aa6a8e235' WHERE randkey = 'CHLVQ6vfq' AND username = 'user.name'

誰でもこれで私を助けることができますか?

4

1 に答える 1

0

クエリが実際に機能していると確信していますか? エラーが出力されていない可能性がありますが、実際に行が更新されているわけではありません。

を利用しmysql_affected_rowsます。この関数は、行が実際に更新されたかどうか (つまり、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();
}
于 2012-06-29T03:16:11.470 に答える