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

password_verify nie działa MYSQL/PHP

Object Storage Arubacloud
0 głosów
1,709 wizyt
pytanie zadane 8 lutego 2017 w PHP przez auradin Użytkownik (560 p.)
edycja 8 lutego 2017 przez Arkadiusz Waluk

Witam proszę o pomoc chcę zabezpieczyć hasła za pomocą password_hash a password_verify nie działa ;/

Od początku:

1. $hash = password_hash($password, PASSWORD_BCRYPT);

2. $hash trafia do bazy i jest prawidłowo zapisany.

3.  Użytkownik wpisuje swój nick i hasło i  PHP cały czas zwraca fałsz mimo, że się wszystko zgadza.

$result = queryMySQL("SELECT * FROM users WHERE user ='$nick' ");

if ($result->num_rows)

{

$row = $result->fetch_array(MYSQLI_ASSOC);

$hash = $row['password'];

if (password_verify($password , $hash))

{

echo "<font color='green'>SESSION SUCCES!</font>";

} else

{ echo "<font color='red'> FALSE </font>";

}

5. i teraz taki numer.. jak pod zmienną $hash skopiuje z bazy to samo co w $row['password'] to PHP zwróci prawdę.

6. Zapis i wyciąganie do i z bazy jest prawidłowe dlatego nie rozumiem i głowie się kilka godzin o co chodzi.. Google też nie dało odpowiedzi.

7. Powyższy kod to tylko niekompletna przerobiona kopia która pokazuje tylko najważniejszy kawałek.

  

 

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

7. Powyższy kod to tylko niekompletna przerobiona kopia która pokazuje tylko najważniejszy kawałek.

No to albo dajemy kod, albo fragmenty które teoretycznie są okej. Pokaż gdzie inicjalizujesz i jak zmienną $password

2 odpowiedzi

+1 głos
odpowiedź 8 lutego 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)

5. i teraz taki numer.. jak pod zmienną $hash skopiuje z bazy to samo co w $row['password'] to PHP zwróci prawdę.

Skoro tak się dzieje to coś musi być nie tak z odczytem z bazy lub dalszym przetwarzaniem w zmiennych.

Przed linią z password_verify() wyświetl $hash, wystarczy echo lub var_dump() i sprawdź czy jest dobry.

komentarz 8 lutego 2017 przez auradin Użytkownik (560 p.)

Właśnie już tak kombinowałem i jest ok xD $row['password'] pokazuje realnie to co jest w bazie. Więc $hash == $row['password'] na 100%. $hash przed password_verify nie istnieje. Punkty 1-2 są w innym pliku.

komentarz 8 lutego 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)

Punkty 1-2 nie są chyba istotne dla tego problemu.

$hash przed password_verify nie istnieje.

Jak to? W podanym kodzie przecież jest:

$hash = $row['password'];
if (password_verify($password , $hash))
...

Jeśli więc w $password i $hash są wartości takie jak powinny (sprawdź przez echo czy var_dump()) to musi działać.

komentarz 8 lutego 2017 przez auradin Użytkownik (560 p.)

tak istnieje. Ale nie istnieje jak dam echo "$hash" przed jego zdefiniowaniem.

Ok zrobiłem tak: pod $hash = $row['password'];

    $a = $hash;
    $b = $password;
    var_dump($a, $b);

i to też zwraca prawdę. Nie zmienia to żadnego faktu, że po dojściu do password_verify nie może ich porównać i zwraca false.

 

komentarz 8 lutego 2017 przez auradin Użytkownik (560 p.)

a jak dam

$hash = $row['password'];

echo "$hash";

Po wyświetleniu na stronie kopinuje i robie tak:

$hash = $row['password'];

$a = TU WKLEJAM ODPOWIEDŹ z echo.

if  (password_verify($password , $a) == true)

......

tak działa prawidłowo

 

 

 

 

komentarz 8 lutego 2017 przez auradin Użytkownik (560 p.)
$row = $result->fetch_array(MYSQLI_ASSOC);
				$x = $row['password'];
				$p = '$2y$10$wxEabDALNVGXUJkFC6kyIe62imbvoRtWF9AjgbE3wrvFphHRWr3Nq'
				if (($x == $p) == true)
				{
					echo "ok";
				}else
				{
					echo "$p</p>$x<br>";
				}
				if  (password_verify($password , $x) == true)
				{
				echo "<font color='green'>SESSION SUCCES!</font>";
				}			
				else
				{
				echo "<font color='red'> FALSE</font></p>";
				}

Teraz to zbaraniałem. Pomimo, że w rzeczywistości $x i $p SĄ identyczne program zwraca fałsz xD ale jak w miejscu password_verify zamiast $x dam $p to działa xDD

2
komentarz 8 lutego 2017 przez efiku Szeryf (75,160 p.)

Co ty robisz?

Logowanie:

1: login = plaintext np email
2: password = haslo. 

pobierasz id,haslo albo konkretne dane nie selec * z tabeli gdzie email=login (PDO::bindowanie) do zmiennej $row["password"] 

pozniej sprawdzasz funkcją password_verify( $password, $row["password"] )

Nie sugeruj się tym, że hashe mają być takie same, nie będą.  

https://3v4l.org/shFS9

Jak widać, działa.

komentarz 8 lutego 2017 przez auradin Użytkownik (560 p.)

ze strony którą podałeś mi zwraca fałsz

komentarz 8 lutego 2017 przez efiku Szeryf (75,160 p.)
edycja 9 lutego 2017 przez efiku

a mi true 

array(4) {
  [0]=>
  string(4) "adam"
  [1]=>
  string(6) "admin1"
  [2]=>
  string(60) "$2y$10$ZHQorcd6/AHZxX8dZ441vuym1j2F4If5gUJPDrhKmIFN3V/N/iWHK"
  [3]=>
  bool(true)
}

Więc gdzieś przekombinowałeś, albo do bazy nie trafia taki hash który powinien ;) 

komentarz 10 lutego 2017 przez auradin Użytkownik (560 p.)

Dziękuje za pomoc!

Znalazłem błąd który nie miał nic wspólnego z tematem. Widać na przyszłość muszę zamieszczać cały kod zapewne dopatrzylibyście się tego pierwsi :)

Błąd polegał na zapisu danych do bazy ale mimo to dane były zapisywane i na pierwszy rzut oka były dobrze zapisane.

Błędu dopatrzyłem się bo zaciekawiło mnie dziwne działanie bazy. Mając i widząc wszystkie dane Baza zwracała mi błąd przy zapytaniu o hasło. A nawet zwracała zero wyników! Z poziomu wiersza poleceń albo phpmyadmin.

Ale mimo to z poziomu PHP wyciągając z bazy wynik był poprawny! Lecz w linijkach sprawdzających poprawność hasła zawsze PHP zwracał już fałsz- i miał racje.

Wystarczyło zmienić linijki dotyczące zapisu danych do bazy. Wszystko działa szkoda, że tak głupi błąd zmarnował mi 2 dni.

 

–3 głosów
odpowiedź 8 lutego 2017 przez 123skiper Bywalec (2,170 p.)
spróbuj użyć funkcji sha1(), bo w moim przypadku przy PASSWORD_DEFAULT na php 7 generowany hash nie zawsze był taki sam. Sha1 zawsze daje taki sam wynik.
5
komentarz 8 lutego 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)
Hash nigdy nie będzie taki sam i jest to celowe działanie. Od tego jest password_verify(), aby odpowiednio to sprawdzić, pomimo tego że finalne hashe są różne.

sha1 stanowczo odradzam.

Podobne pytania

+1 głos
1 odpowiedź 145 wizyt
pytanie zadane 9 marca 2021 w PHP przez niezalogowany
0 głosów
0 odpowiedzi 235 wizyt
pytanie zadane 30 lipca 2020 w PHP przez darekx10 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 400 wizyt
pytanie zadane 5 listopada 2022 w PHP przez zbiku25 Bywalec (2,940 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...