• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
1,521 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 (286,610 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 (286,610 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,180 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 (286,610 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ź 126 wizyt
pytanie zadane 9 marca 2021 w PHP przez niezalogowany
0 głosów
0 odpowiedzi 208 wizyt
pytanie zadane 30 lipca 2020 w PHP przez darekx10 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 5 listopada 2022 w PHP przez zbiku25 Bywalec (2,860 p.)

91,847 zapytań

140,523 odpowiedzi

317,030 komentarzy

61,170 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...