Nano Hash - криптовалюты, майнинг, программирование

Как изменить пароль с помощью password_hash?

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

Я знаю, что должен использовать password_verify, но не знаю, какую часть этого кода мне следует вставить?

<?php
  include 'session.php';
  $db = new mysqli('localhost', 'root', '', 'alumni');
  if(isset($_POST['submit'])):
  extract($_POST);


  $user_check=$_SESSION['login_user'];

  $old_pwd=$_POST['old_password'];
  $pwd=$_POST['password'];
  $c_pwd=$_POST['confirm_pwd'];
  if($old_pwd!="" && $pwd!="" && $c_pwd!="") :


  if($pwd == $c_pwd) :
  if($pwd!=$old_pwd) :
    $sql="SELECT * FROM `alumni` WHERE `username`='$user_check' AND `password` ='$old_pwd'";
    $db_check=$db->query($sql);
    $count=mysqli_num_rows($db_check);
  if($count==1) :
    $fetch=$db->query("UPDATE `alumni` SET `password` = '$pwd' WHERE `username`='$user_check'");
    $old_pwd=''; $pwd =''; $c_pwd = '';
    $msg_sucess = "Password successfully updated!";
  else:
    $error = "Old password is incorrect. Please try again.";
  endif;
  else :
    $error = "Old password and new password are the same. Please try again.";
  endif;
  else:
    $error = "New password and confirm password do not match.";
  endif;
  else :
    $error = "Please fill all the fields";
  endif;   
  endif;
?> 

  • Забудьте начать сессию сверху!! Вам нужно добавить session_start() вверху страницы!! 14.04.2016
  • @Сати, ты имеешь в виду session_start(). 14.04.2016
  • АААА: моя ошибка @JannisM да, я серьезно!! Спасибо 14.04.2016
  • я просто забыл скопировать его, извините. я уже отредактировал это, но моя проблема все та же @Saty 14.04.2016
  • Вы никогда не хэшируете $old_pwd перед тем, как использовать его в $sql="SELECT * FROM `alumni` WHERE `username`='$user_check' AND `password` ='$old_pwd'";. 14.04.2016
  • да сэр, потому что я не уверен, как это сделать? @Шон 14.04.2016
  • Ну, вместо того, чтобы делать SELECT *, можно было выбрать password, т.е. $sql="SELECT `password` FROM `alumni` WHERE `username`='$user_check'";. Тогда вместо использования if($count==1) вы можете просто сделать if(password_verify($old_pwd,$db_check->fetch()['password']) 14.04.2016
  • я попробую это сейчас! @Шон 14.04.2016
  • попробовал, но получил фатальную ошибку Call to undefined method mysqli_result::fetch(), которая относится к строке if(password_verify($old_pwd,$db_check->fetch()['password'])): @Sean 14.04.2016
  • Я забыл, что mysqli->fetch() требует ->bind_result(). Попробуйте ->fetch_assoc(), т.е. if(password_verify($old_pwd,$db_check->fetch_assoc()['password'])): 14.04.2016
  • Ошибки нет, но в сообщении говорится, что мой старый пароль неверен. Я полагаю, что мой old_pwd еще не хеширован? Должен ли я хешировать это? @Шон 14.04.2016

Ответы:


1

У меня наконец-то работает! Большое спасибо за помощь, особенно сэру Шону! :D

Я изменил это:

 $sql="SELECT * FROM `alumni` WHERE `username`='$user_check' AND `password` ='$old_pwd'";
$db_check=$db->query($sql);
$count=mysqli_num_rows($db_check);

if($count==1) :
    $fetch=$db->query("UPDATE `alumni` SET `password` = '$pwd' WHERE `username`='$user_check'");

к этому:

 $sql=("SELECT * FROM alumni WHERE username='$user_check'");
 $db_check=$db->query($sql);
 if(password_verify($old_pwd,$db_check->fetch_assoc()['password'])):
$fetch=$db->query("UPDATE `alumni` SET `password` = '$new_pw' WHERE username`='$user_check'");

И да, я добавил новую переменную $new_pw

$new_pw = password_hash($c_pwd, PASSWORD_DEFAULT);

Если вы думаете, что я сделал это неправильно, пожалуйста, не стесняйтесь комментировать. Спасибо :)

14.04.2016

2

Попробуйте это

<?php
  include 'session.php';
  session_start();
  $db = new mysqli('localhost', 'root', '', 'alumni');
  if(isset($_POST['submit'])):
  extract($_POST);


  $user_check=$_SESSION['login_user'];

  $old_pwd=$_POST['old_password'];
  $pwd=$_POST['password'];
  $c_pwd=$_POST['confirm_pwd'];
  if($old_pwd!="" && $pwd!="" && $c_pwd!="") :


  if($pwd == $c_pwd) :
  if($pwd!=$old_pwd) :
    $sql="SELECT * FROM `alumni` WHERE `username`='$user_check' AND `password` =PASSWORD($old_pwd)";
    $db_check=$db->query($sql);
    $count=mysqli_num_rows($db_check);
  if($count==1) :
    $fetch=$db->query("UPDATE `alumni` SET `password` = PASSWORD($pwd) WHERE `username`='$user_check'");
    $old_pwd=''; $pwd =''; $c_pwd = '';
    $msg_sucess = "Password successfully updated!";
  else:
    $error = "Old password is incorrect. Please try again.";
  endif;
  else :
    $error = "Old password and new password are the same. Please try again.";
  endif;
  else:
    $error = "New password and confirm password do not match.";
  endif;
  else :
    $error = "Please fill all the fields";
  endif;   
  endif;
?> 
14.04.2016
  • ОП использует password_hash() и password_verify(), а не md5() 14.04.2016
  • password_hash() — это функция PHP, не функция MySQL, поэтому она не будет работать в таком запросе. Поэтому его либо нужно хэшировать перед запросом, т.е. $old_pwd=password_hash($_POST['old_password']);, или вам нужно его конкатенировать, т.е. ... SET `password` = ".password_hash($pwd)." ... 14.04.2016
  • где ты это увидел в моем ответе? 14.04.2016
  • Похоже, вы изменили password_hash() на PASSWORD() в своем последнем редактировании, что я пропустил 14.04.2016
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..