2015-12-29 4 views
0

Мой сценарий должен работать так:Что такое надежный подход к изменению паролей в PHP?

  • Вставьте старый пароль и
  • затем Новый Passsword.

старый пароль работает и проверен, но когда я вставить новый пароль код не работает ... без ошибок, ничего ...

Вот код, который я до сих пор:

$user_p = $_SESSION['user']['username']; 

if(empty($_SESSION['user'])) 
{ 
    header("Location: live.php");  
    die("Redirecting to live.php"); 
} 

if(!empty($_POST)) 
{ 
    $currentPassword = preg_replace('/\s+/', '', $_POST['currentPassword']); 
    $newPassword = preg_replace('/\s+/', '', $_POST['newPassword']); 
    $oldpass = IrBuscarPassword($_SESSION['user']['username']); 
    $saltcode = IrBuscarSalt($_SESSION['user']['username']); 

    $formEncriptedPass = hash('sha256', $currentPassword . $saltcode); 
     for($round = 0; $round < 65536; $round++) 
     { 
      $formEncriptedPass = hash('sha256', $formEncriptedPass . $saltcode); 
     } 

    $changepass = False; 

    if($oldpass != $formEncriptedPass) 
    { 
     echo "Password NO-OK."; 
     //die(); 
    } 
    else 
    { 

     if($newPassword == '') 
     { 
      $_SESSION['error'] = " The field E-mail is empty.</span></div>"; 
     } 
     else 
     { 
      if($newPassword == '' || !isset($newPassword)) 
      { 
       $changepass = False; 

      } 
      else 
      { 

       $changepass = True; 
       atualizarMail($newPassword, $_SESSION['user']['username']); 
      } 
     } 

    } 


    if(!isset($currentPassword) || ($currentPassword == '')) 
    { 
     $_SESSION['error'] = " The Password field is empty.</span></div>"; 
    } 

    $password = hash('sha256', $_POST['currentPassword'] . $saltcode); 


    if($changepass == False) 
    { 
     $_SESSION['error'] = "<br/>New Password.</span></div>"; 
    } 


    if($_POST['newPassword'] != $_SESSION['user']['username']) 
    { 


     $query = " 
      SELECT 
       1 
      FROM users 
      WHERE 
       password = :newPassword 
     "; 


     $query_params = array( 
      ':newPassword' => $_POST['newPassword'] 
     ); 

     try 
     { 

      $stmt = $db->prepare($query); 
      $result = $stmt->execute($query_params); 
     } 
     catch(PDOException $ex) 
     { 

      die("Failed to run query: " . $ex->getMessage()); 
     } 

     $row = $stmt->fetch(); 

    } 

    if(!empty($_POST['newPassword'])) 
    { 
     $salt = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); 
     $password = hash('sha256', $_POST['newPassword'] . $salt); 
     for($round = 0; $round < 65536; $round++) 
     { 
      $password = hash('sha256', $password . $salt); 
     } 
    } 
    else 
    { 
     $password = null; 
     $salt = null; 
    } 
     if(isset($_SESSION['error'])) 
     { 
      echo $_SESSION['error']; 

      $_SESSION['error'] = null; 
     } 
    else 
    { 
     $_SESSION['user']['password'] = $_POST['newPassword']; 
     $_SESSION['success'] = " The password has been successfully changed..</span></div>"; 

     header("Location: password.php"); 

     die("Redirecting to logout.php"); 
    } 
} 

Может кто-нибудь мне помочь?

+0

'insert new password' где? Я не вижу никакого запроса на вставку. –

+0

В вашем коде нет инструкции 'INSERT' ... –

+0

Да, есть функция, но нет ... « -----> atualizarMail <--- ($ newPassword, $ _SESSION [ 'пользователь'] [ 'имя пользователя']);» – Mark

ответ

0

У вашего кода много проблем и его трудно прочитать/понять. Некоторые примеры:

  • Вы проверить те же вещи снова и снова if($newPassword == '')
  • Вы делаете разные вещи в одной функции atualizarMail()
  • Ваш хэш-функция является небезопасным и не на будущее. Он реализуется не менее чем в 3-х местах. Хранение соли можно сделать намного проще.
  • Пароли не подлежат дезинфекции, только валидированы (нет preg_replace())
  • Строка if($_POST['newPassword'] != $_SESSION['user']['username']) не имеет смысла.
  • Есть слишком много уровней if заявлений, в сочетании с использованием штатов $changepass (трудно читать, легко сделать ошибку)
  • Запроса SELECT 1 FROM users WHERE password = :newPassword не будет, надеюсь, никогда не получать какие-либо данные, поскольку только хэш хранится в базе данных ,

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

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Вторая функция password_verify() можно использовать для входа в систему, а также проверить, соответствует старый пароль.

Еще один совет, подтвердите все входные данные в начале сценария и сразу же перенаправите, если возникнут какие-либо проблемы. После выполнения проверки не проверяйте снова неверный ввод, просто используйте его.

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