Текущий пароль PHP не такой как в базе данных - PullRequest
0 голосов
/ 24 ноября 2011

Я создаю функцию для редактирования пароля пользователя здесь код функции.

function updateUser ()
{


    $current = md5($_POST['cpassword']);
    $new = md5($_POST['npassword']);
    $newc = md5($_POST['npasswordc']);

    $name = $_POST['username'];
    connectDB();

        $check = mysql_query("SELECT password FROM user WHERE user_name = '$name'") 

        or die(mysql_error());


            if ($check != $current) {

            ?> <div id="error">
                <?php die('Current password is wrong. Press back to try again.'); ?>
                </div> <?php

            }

        if ($new == $newc) :

            $sql = "UPDATE user SET password = '$new' WHERE user_name = '$name'";
            execute($sql);

            ?> <div id="error">
            <?php die('Password Successfully Updated. Back to <a href="/dashboard">dashboard</a>');
            ?> </div>  <?php

        else :  ?> <div id="error">
            <?php die('New Password did not match. Press back to try again');
            ?> </div>  <?php

        endif;


}

значение будет передано в форме на другой странице, все, кажется, работает нормально. Когда я пытаюсь сменить пароль, он говорит, что успешно, и когда я проверяю в базе данных, значение md5 меняется, что означает, что пароль был изменен.

Но когда я пытаюсь изменить пароль с тем же именем пользователя, мне все равно нужно ввести старый пароль для текущего пароля, даже если в базе данных он уже изменился?

В чем проблема?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Я изменил твой код ... возможно это работает.также посмотрите комментарии, это объясняет что-то, может быть, это помогает:

function updateUser ()
{
    $current = md5($_POST['cpassword']);
    $new = md5($_POST['npassword']);
    $newc = md5($_POST['npasswordc']);

    // first check if the passwords matches if not why waist the connection
    if ($new == $newc) {
        $name = $_POST['username'];
        connectDB();

        // why not checking your pass in the query
        // when a result is zero it means there is no match found
        $check = mysql_query("SELECT password FROM user WHERE user_name = '{$name}' AND password = '{$current}'") or die(mysql_error());
        $result = mysql_fetch_assoc($check);

        // You where checking a resource with a string(MD5)?
        if (mysql_num_rows($check) == 0) {
            ?><div id="error">
            <?php die('Current password is wrong. Press back to try again.'); ?>
            </div><?php
            return false;
        } else {
            // update the query with the ID you got from the check..
            // why? because a ID is always unique
            $sql = "UPDATE user SET password = '{$new}' WHERE user_id = '{$result['user_id']}'";
            execute($sql);

            ?><div id="error">
            <?php echo 'Password Successfully Updated. Back to <a href="/dashboard">dashboard</a>';
            ?></div><?php
            return true;
        }
    } else {
        ?><div id="error">
        <?php echo 'New Password did not match. Press back to try again';
        ?></div><?php 
        return false;
    }
}
0 голосов
/ 24 ноября 2011

$check - это ресурс mysql, а не значение. Вы могли бы сделать

if($check && (mysql_num_rows($check) > 0))
{
  $res = mysql_fetch_assoc($check);
  if($res['password'] != $current) {

Будьте осторожны с SQL-инъекциями, вы должны сделать хотя бы

$name = mysql_real_escape_string($_POST['username']);

перед вводом в запрос.

Кроме того, md5 - это алгоритм недельного хэширования, я настоятельно рекомендую вам использовать SALT, и лучше использовать хеш-алгоритмы, как минимум, sha1 () или лучше для семейства sha2 (sha256, sha512, например) или bcrypt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...