• 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,685 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ź 442 wizyt
pytanie zadane 9 stycznia 2016 w SQL, bazy danych przez Marian Kowal Użytkownik (960 p.)
0 głosów
1 odpowiedź 767 wizyt
pytanie zadane 8 grudnia 2015 w PHP przez Mateusz11 Pasjonat (22,910 p.)
0 głosów
4 odpowiedzi 438 wizyt
pytanie zadane 24 lipca 2016 w PHP przez Abel Mądrala (5,140 p.)

92,540 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...