2015-01-14 5 views
0

Насколько я пытался, я не понимаю, почему этот код не работает. Всякий раз, когда я пытаюсь изменить пароль с помощью этой страницы, он говорит, что был указан неверный пароль.Невозможно правильно изменить пароль

Это последняя страница, которую я должен получить для работы на этом сайте, поэтому любая помощь будет оценена.

<?php 
require_once ("dbconnect.php"); 

// include file to do db connect 

require_once ('checklog.php'); 

require_once ("functions.php"); 

session_start(); 
$username = ($_POST['username']); 
$password = ($_POST['password']); 
$newpassword = ($_POST['newpassword']); 
$repeatpassword = ($_POST['repeatpassword']); 

if (isset($_POST['submit'])) { 
    if ($username && $password) { 
     $hashpass = salt($password); 
     $query = "SELECT ID FROM users WHERE username='$username' AND password='$hashpass'"; 

     if ($username == $datausername && salt($password) == $datapassword) { 


      // PASSWORD CHANGING IS DONE HERE 

      if ($newpassword == $repeatpassword) { 

       // From register 

       if (strlen($newpassword) > 25 || strlen($newpassword) < 6) { 
        $message = "Password must be 6-25 characters long"; 
       } 
       else { 

        // part 8 
        // Process details here 

        if ($db_server) { 
         die("Unable to connect to MySQL: " . mysqli_connect_error()); 
         $db_status = "not connected"; 
        } 
        else { 
         if ($db_server) { 

          // clean the input now that we have a db connection 

          $newpassword = clean_string($db_server, $newpassword); 
          $repeatpassword = clean_string($db_server, $repeatpassword); 
          mysqli_select_db($db_server, $db_database); 
          $result = mysqli_query($db_server, $query); 
          if ($row = mysqli_fetch_array($result)) { 
           $message = "This is your current password. Please try again."; 
          } 
          else { 

           // Process further here 

           $newpassword = salt($newpassword); 
           $query = "UPDATE INTO users (password) VALUES ('$password')"; 
           mysqli_query($db_server, $query) or die("Insert failed. " . mysqli_error($db_server)); 
           $message = "<h1>Your password has been changed!</h1>"; 
          } 

          mysqli_free_result($result); 
         } 
         else { 
          $message = "Error: could not connect to the database."; 
         } 

         mysqli_close($db_server); 

         // include file to do db close 

        } 
       } 

       // This code appears if passwords dont match 

      } 
      else { 
       $message = "<h1>Your new passwords do not match! Try again.</h1>"; 
      } 
     } 
     else { 
      $message = "<h1>Incorrect password!</h1>"; 
     } 
    } 
    else { 
     $message = "<h1>That user does not exist!</h1>" . "Please <a href='password.php'>try again</a>"; 
    } 

    // Close connection! 

} 
else { 
    $message = "<h1>Please enter a valid username/password</h1>"; 
} 

?> 



<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 

<?php 
include_once ("header.php"); 
?> 
<div id="apDiv1"><span class="rich-list"> 
<title>Change your Password</title> 


<h1>So you want to change your password, <?php 
echo $_SESSION['username']; 
?>?</h1> 


<form action='password.php' method='POST'> 

    <div align="right">Current Username: 
    <input type='text' name='username'><br /> 
Current Password: <input type='password' name='password'><br /> 
New Password: <input type='password' name='newpassword'><br /> 
Repeat New Password: <input type='password' name='repeatpassword'><br /> 

    <input type='submit' name='submit' value='Confirm'> 

    <input name='reset' type='reset' value='Reset'> 
    </div> 
</form> 

<?php 
echo $message 
?> 

<?php 
include_once ("footer.php"); 
?> 
</div> 
</body> 
</html> 
</body> 
</html> 

ответ

0

Игнорирование много плохих практик в вашем коде на данный момент, проблема заключается в том, что вы никогда не получить пароль пользователя из базы данных:

// $datausername and $datapassword have not been set, so this will always be false 
if ($username == $datausername && salt($password) == $datapassword) { 
    // ... code 
} else { 
    $message = "<h1>Incorrect password!</h1>"; 
} 

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

Чтобы выполнить запрос, сначала установить соединение с базой данных:

$dbc = new mysqli("db_host", "db_user", "db_password", "db_name"); 
if (mysqli_connect_errno()) { 
     die("Could not connect to MySQL: " . mysqli_connect_error()); 
} 

Давайте предположим, что вы сделали, что в файле «dbconnect.php», так что теперь у вас есть действительное соединение $ DBC и ваш запрос $ строка. Следующее предоставит вам объект mysqli_result или FALSE, если запрос завершится с ошибкой.

$result = $dbc->query($query); 

Дополнительную информацию об использовании этого объекта см. В руководстве по PHP.

Кроме того, PHP имеет отличную встроенную функцию, называемую password_hash. Я предлагаю вам использовать это вместо того, что представляется настраиваемой функцией «соль».

Для дальнейшего совершенствования кода вы должны узнать о SQL Injection и о том, как его избежать, например, с помощью prepared statements.

+0

Благодарим за помощь! Итак, мне нужно запустить запрос? Как я могу сделать это? Я, наверное, знаю это, но я был с этим с 9 утра, и мой разум буквально превратился в месиво. – richmothy

+0

Я отредактирую свой ответ, чтобы включить его. – Brian

+0

Мне очень жаль, по-видимому, я просто не понимаю ... Я попробовал добавить MYSQL-запрос, и он все равно просто делает то же самое. – richmothy

0

Я не знаю, как определена функция «соли» - вы можете включить ее в свой пост.

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

Таким образом, для проверки пароля:

  • получить имя пользователя и догадку,
  • получить зашифрованный пароль для пользователя
  • получить соль с зашифрованным паролем (часто первые несколько символов)
  • зашифровать догадку солью из зашифрованного пароля
  • Сравните это зашифрованное предположение с зашифрованным паролем.
Смежные вопросы