• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP i MySQL - Zmiana hasła - porównywanie zahaszowanych haseł

Object Storage Arubacloud
0 głosów
1,704 wizyt
pytanie zadane 5 lutego 2017 w SQL, bazy danych przez lukasz1390 Użytkownik (500 p.)

Witam. W bazie przechowuję hasła w postaci zahaszowanej funkcją password_hash. Kod na zmianę hasła dla użytkownika działa, wszystko pięknie hasła są zmieniane poprawnie (użytkownik podaje dwukrotnie nowe hasło)

if((isset($_POST['haslo']))&&isset($_POST['haslo1'])&&isset($_POST['haslo2']))
{ 																															
$walidacja=true;	
$user = $_SESSION['user'];
$starehaslo = $_POST['haslo'];
$nowehaslo1 = $_POST['haslo1'];
$nowehaslo2 = $_POST['haslo2'];
	if (strlen($starehaslo)<1)
	{
		$walidacja=false;
		$_SESSION['e_starehaslo']= "Proszę podać aktualne hasło.<br>";
		$_SESSION['e_div']= true;
	}
	
	
	
	if (strlen($nowehaslo1)<8)
	{
		$walidacja=false;
		$_SESSION['e_haslo']= "Nowe hasło powinno mieć co najmniej 8 znaków.<br>";
		$_SESSION['e_div']= true;
	}
	if ($nowehaslo1 !=$nowehaslo2)
	{
		$walidacja=false;
		$_SESSION['e_haslo']= "Podane hasła nie są takie same.<br>";
		$_SESSION['e_div']= true;
	}
	 $haslo_hash = password_hash($nowehaslo1, PASSWORD_DEFAULT);
	 
	 require_once "connect.php";
      mysqli_report(MYSQLI_REPORT_STRICT);
	  
	try
            {
                $polaczenie= mysqli_connect($host,$db_user,$db_password,$db_name);
                    if ($polaczenie->connect_errno!=0)
                    {
                        throw new Exception(mysqli_connect_errno());
                    }
                    else
                    {
						
	
	if($walidacja==true)
	{
		$zmiana = "UPDATE uzytkownicy SET pass = '$haslo_hash' WHERE user='$user'";
                                if ($polaczenie->query($zmiana) === true)
								{																																		
									echo '<div id="panel" style="display:none;">Hasło zostało zmienione</div>';												
                                }
								 else{
                                        throw new Exception($polaczenie->error);
                                        }
                             }
                        $polaczenie->close();
                    }
    }

			catch(Exception $e)
            {
                echo'<br />info: '.$e;
            }
	}
?>


Chciałbym teraz zrobić porównanie dwóch haseł - aktualnego, które poda użytkownik z tym zahaszowanym z bazy.

W literaturze jaką posiadam (PHP I MySQL Księga przykładów) nie znalazłem nic pomocnego i  internety nie oferują nic nadzwyczajnego co by pomogło. Można prosić o wskazówki, przykłady i porady jak to zrobić?

1
komentarz 5 lutego 2017 przez efiku Szeryf (75,160 p.)

a pomyślałeś na logikę, że skoro jest password_hash, to musi być coś co weryfikuje?

np. password_verify?

1 odpowiedź

0 głosów
odpowiedź 5 lutego 2017 przez xandros Nałogowiec (29,450 p.)
edycja 5 lutego 2017 przez xandros

Szukasz w bazie usera po mailu lub loginie, a nastepnie weryfikujesz jego haslo za pomocą tego co efik napisał:

http://php.net/manual/en/function.password-verify.php

Łap na szybko napisany kod:

<?php

$pdo = new \PDO($dns, $dbUsername, $dbPassword);
$stmt = $pdo->prepare("SELECT password_hash FROM users WHERE email = :email");
if($stmt->execute(['email' => $email,])){
    $fetch = $stmt->fetch(\PDO::FETCH_NUM);
    list($passwordHash) = $fetch;
    var_dump($fetch, $passwordHash);
    if(password_verify($password, $passwordHash)){
        echo 'poprawne haslo';
    } else {
        echo 'niepoprawne haslo'
    }
}else {
    echo 'nie mozna wykonać zapytania: `SELECT password_hash FROM users WHERE email = :email`';
}

Edit:

Po konsultacji z efikiem i drobnej edycji kodu:

<?php

$pdo = new PDO($dns, $dbUsername, $dbPassword);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('SELECT * from user where nickname = :email');
$stmt->execute(['email'=> $email]); //moze wyrzucic wyjatek przy zlym stmt
if($user = $stmt->fetch(PDO::FETCH_OBJ)){ //jesli nie znajdzie usera o danym emailu, to $user bedzie pusta == false
    var_dump($user);
    if(password_verify($password, $user->password_hash)){
        echo 'poprawne haslo';
    }else{
        echo 'niepoprawne haslo';
    }
}

 

komentarz 5 lutego 2017 przez xandros Nałogowiec (29,450 p.)
nie zapomnij obsłużyć wyjątków, zanim pójdzie na produkcje, bo nie chcemy, by ktoś poznał twoje passy do bazy, czyż nie? :D

Podobne pytania

0 głosów
1 odpowiedź 451 wizyt
pytanie zadane 9 stycznia 2016 w SQL, bazy danych przez Marian Kowal Użytkownik (960 p.)
0 głosów
1 odpowiedź 774 wizyt
pytanie zadane 8 grudnia 2015 w PHP przez Mateusz11 Pasjonat (22,910 p.)
0 głosów
4 odpowiedzi 474 wizyt
pytanie zadane 24 lipca 2016 w PHP przez Abel Mądrala (5,140 p.)

92,702 zapytań

141,615 odpowiedzi

320,180 komentarzy

62,060 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...