2014-01-09 4 views
0

Привет Я пытаюсь создать страницу, где мои пользователи могут изменить свой пароль. Когда я ввожу текущий пароль и пытаюсь его изменить, он, похоже, не распознает текущий пароль. Мне было интересно, так это потому, что я использовал md5 и salt1 и salt2 в пароле в другом php-файле?Изменение пароля пользователя через базу данных

Вот мой код, любая помощь и совет будут высоко оценены.

<?php 
session_start(); 


require_once ("connect.php"); 
require_once 'functions/cleanstring.php'; 
require_once 'functions/encrypt.php'; 


$password = clean($db_server, $_POST['password']); 
$newpassword = clean($db_server, $_POST['newpassword']); 
$repeatnewpassword = clean($db_server, $_POST['repeatnewpassword']); 


if ($_POST['submit'] == 'Change') { 
    if ($password && $newpassword && $repeatnewpassword) { 
     if ($newpassword == $repeatnewpassword) { 
      if ($db_server) { 

       mysqli_select_db($db_server, $db_database); 
       $password = ($password); 
       // check whether username exists 

       $query = "SELECT password FROM users WHERE password='$password' AND   username='" . $_SESSION['username'] . "'"; 
       $result = mysqli_query($db_server, $query); 

       if ($row = mysqli_fetch_array($result)) { 
        $newpassword = salt($newpassword); 
        $query = "UPDATE `users` SET `password`='$newpassword' WHERE `username`='" . $_SESSION['username'] . "'"; 

        mysqli_query($db_server, $query) or 
          die("Insert failed. " . mysqli_error($db_server)); 
        $message = "<strong>You've changed your password!</strong>"; 

        //require_once("db_close.php"); 
        // Process further here 
       } else { 
        $message = "Please type the correct current password!"; 
       } 
       mysqli_free_result($result); 
      } else { 
       $message = "Error: could not connect to the database."; 
      } 
      //require_once("db_close.php"); 
     } else { 
      $message = "The new password and the 'Repeat New Password' must match!"; 
     } 
    } else { 
     $message = "Fill all fields."; 
    } 
} 
?> 

<?php 
include_once("templates/open.php"); 
?> 


<form action='changepassword.php' method='POST'> 
    Password: <input type='password' name='password'><br /> 
    New Password: <input type='password' name='newpassword'><br /> 
    Retype New Password: <input type="password" name="repeatnewpassword"><br/> 
    <input type='submit' name='submit' value='Change'> 
    <input name='reset' type='reset' value='Reset'> 
</form> 

<?php echo $message; ?> 
<p><a href='login.php'>Go back</a></p> 
<?php 
require_once 'templates/close.php'; 
?> 

</body> 
</html> 
+0

Возможно, ваша догадка верна. Если вы храните хэшированные пароли, вам нужно будет хешировать, прежде чем делать выбор. Похоже, что строка с паролем $ password = ($ password) должна использовать соль. $ password = salt ($ password). Однако это все еще выглядит неправильно. Где вы храните соль? Если для каждого пользователя такая же соль, это неэффективно. Соль должна быть сохранена в таблице паролей с хешированным значением пароля, чтобы ее можно было использовать позднее. – RacerNerd

+0

Значение My Salt хранится внутри этого файла php с именем encrypt.php >> Функция шифрования ($ пароль) { \t $ salt1 = "egf"; \t $ salt2 = "7yh"; \t $ password = md5 ($ salt. $ Password. $ Salt2); \t return $ password; } Я создаю админ-сайт, поэтому нужен только один пользователь, поэтому, как сайт с одним пользователем, у меня есть только эта соль. В моей базе данных cPanel у меня есть длинный пароль хеширования md5, показывающий мне .. хешированная версия того, который пользователь вводит на сайт. добавить ли я соль на фронт и конец? извините еще раз и благодарим вас за помощь. – user3178755

+0

Вы должны сделать ту же процедуру как при выборе, так и при сохранении. Поэтому используйте тот же солевой образец. Один из способов отладить это - это напечатать хешированное значение, которое вы используете при выборе на экране перед запуском запроса. Затем вы можете вручную сравнить это значение с таковым в базе данных. Если они не совпадают, возникает проблема при преобразовании в хешированный формат. Если они совпадают, возникает проблема в запросе или в том, как обрабатываются результаты запроса. – RacerNerd

ответ

1

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

Ваш код должен быть изменен:

$password = ($password); 

к:

$password = salt($password); 
1

При сохранении пароля с помощью md5(), вы должны сравнить его с ввода данных пользователем, как:

if(md5($password) == $db_password) ... 

OR

if(salt($password) == $db_password) ... 
+0

thankyou ... но я добавил функцию salt1 к текстовому паролю: mysqli_select_db ($ db_server, $ db_database); $ пароль = соль1 (пароль $); и он дает мне ошибку «вызов неопределенной функции salt1» это мой файл с зашифрованным php: функция encrypt ($ password) { $ salt = "egf"; \t // $ salt2 = "7yh"; \t $ password = md5 ($ salt. $ Password); //. $ Salt2); \t return $ password; } Я не вижу ошибки ... извините, что запутался, и спасибо! – user3178755

Смежные вопросы