Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP PDO password_verify nie działa
Forum PHP.pl > Forum > PHP
alberthus
Witam

Mam problem z logowanie, ponieważ nie wiem jak odczytać zaszyfrowane hasło.

W rejestracji wrzucam je tym:
  1. $new_password = password_hash($this->password, PASSWORD_DEFAULT);


W logowaniu próbuję wybrać i odczytać tym ale nie przepuszcza. Hasła nie szyfrowane loguje normalnie.

  1. function logowanie(){
  2.  
  3.  
  4. try{
  5.  
  6. $query = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
  7.  
  8. $query->execute(array(':username'=>$this->username,':password'=>$this->password));
  9.  
  10. }catch(Exception $e){
  11.  
  12. echo $e->getMessage();
  13. }
  14.  
  15. $wynik = $query->fetch(PDO::FETCH_ASSOC);
  16.  
  17.  
  18. if(password_verify($this->password, $wynik['password'])){
  19.  
  20.  
  21. return TRUE;
  22.  
  23. }else{
  24. throw new Exception("error");
  25. }
  26.  
  27. }


Jak to poprawić?
nospor
$query->execute(array(':username'=>$this->username,':password'=>$this->password));
A co masz pod $this->password?

W ogole w tym warunku ma nie byc password, tylko samo username. password potem sprawdzasz przez password_verify()
alberthus
Pod $this->password siedzi to co wpiszę w formularzu logowania. Wyżej jest przekazywane.

I jak dalej?
viking
I jak string 'moje_haselko' ma być równy np zapisanemu w bazie $argon2i$v=19$m=1024,t=2,p=2$TmxLemFoVnZFaEJuT1NyYg$4j2ZFDn1fVS70ZExmlJ33rXOinafcBXrp6A6grHEPkI ?
Masz pobrać użytkownika bez AND password... i następnie sprawdzić password_verify oba stringi.
Pyton_000
Tylko broń cie panie nie próbuj robić password_hash i tego porównywać gdziekolwiek...
alberthus
Nie do końca rozumiem. Dlaczego nie pobierać password z bazy(czyli tego ciągu znaków zaszyfrowanego) skoro muszę go przyrównać z tym co w formularzu ktoś podaje?

Chyba że ja nie rozumiem na czym polega rozszyfrowanie tego.

Cytat(Pyton_000 @ 5.12.2017, 12:43:28 ) *
Tylko broń cie panie nie próbuj robić password_hash i tego porównywać gdziekolwiek...


Dokładnie - chyba nie wiem na czym to polega

Możecie rozjaśnić? Tylko nie odsyłajcie do manuala bo ja już parę dni z tym walczę.
viking
Masz pobrać hasło z bazy ale tylko na podstawie username. Ta część - AND password = :password nigdy ci się nie zgodzi bo to dwa różne stringi.
I do tego skrypt wywali ci się jeśli wybierze więcej niż jeden wynik.

Tutaj masz masz opisane bez bazy.
alberthus
Wróciłem do tego projektu po dłuższym czasie ale nadal jest problem.

Otóż przepuszcza mnie z byle jakim hasłem.

Pod $this->password siedzi hasło, które przyszło z formularza
a pod $wynik['password'] jest zaszyfrowane hasło z bazy

Jak to naprawić?

  1.  
  2. function logowanie(){
  3.  
  4.  
  5. try{
  6.  
  7. $query = $this->pdo->prepare("SELECT * FROM users WHERE username = :username");
  8.  
  9. $query->execute(array(':username'=>$this->username));
  10.  
  11. }catch(Exception $e){
  12.  
  13. echo $e->getMessage();
  14. }
  15.  
  16. $wynik = $query->fetch(PDO::FETCH_ASSOC);
  17.  
  18.  
  19. if(password_verify($this->password, $wynik['password'])){
  20.  
  21.  
  22. return TRUE;
  23.  
  24. }else{
  25. throw new Exception("error");
  26. }
  27.  
  28. }
  29.  
Pyton_000
No i? Teraz kod jest ok więc może oświecisz co nie działa.
alberthus
Jak podam błędny login i hasło to wyrzuci Exception("error") ale jak podam poprawny login i dowolne hasło to loguje.

Tą część źle wykonuje. Echa nie pokazuje.

  1.  
  2. if($query->rowCount() > 0){
  3.  
  4.  
  5. if(password_verify($this->password , $wynik['password'])){
  6.  
  7. echo "Password Valid!";
  8.  
  9. }else{
  10. echo "Password invalid!";
  11. }
  12. }else{
  13. throw new Exception("Login lub hasło są niepoprawne");
  14. }
  15.  
Pyton_000
To może pokaż cały kod a nie tylko urywek. Bo na razie pokazałeś 2 kawałki kodu które nie są ze sobą zbieżne.
alberthus
  1. class Login {
  2.  
  3. private $username;
  4. private $password;
  5. private $con;
  6.  
  7. function __construct($username, $password) {
  8.  
  9. $this->setData($username, $password);
  10. $this->connectToDb();
  11. $this->getData();
  12. }
  13.  
  14. private function setData($username, $password) {
  15. $this->username = $username;
  16. $this->password = $password;
  17. }
  18.  
  19. private function connectToDb(){
  20.  
  21. include 'Database.php';
  22.  
  23. $this->con = new Database();
  24.  
  25. }
  26.  
  27.  
  28.  
  29. function getData(){
  30.  
  31. try{
  32.  
  33. $query = $this->con->prepare("SELECT * FROM users WHERE username = :username");
  34.  
  35. $query->execute(array(':username'=>$this->username));
  36.  
  37. $wynik = $query->fetch(PDO::FETCH_ASSOC);
  38.  
  39.  
  40. //var_dump($wynik)
  41. //var_dump($this->password);
  42. //exit;
  43.  
  44. }catch(Exception $exc){
  45.  
  46. echo $exc->getTraceAsString();
  47. }
  48.  
  49.  
  50.  
  51. if($query->rowCount() > 0){
  52.  
  53.  
  54. if(password_verify($this->password , $wynik['password'])){
  55.  
  56. echo "Password Valid!";
  57.  
  58. }else{
  59. echo "Password invalid!";
  60. }
  61. }else{
  62. throw new Exception("Login lub hasło są niepoprawne");
  63. }
  64.  
  65. }
  66.  
  67. function close(){
  68. $this->con->close();
  69. }
  70.  
  71. }
  72.  


a w kontrolerze tworze obiekt.

  1. try{
  2. $login = new Login($username, $password);
  3.  
  4. if($login == TRUE){
  5.  
  6. $_SESSION['username'] = $username;
  7.  
  8. }else{
  9. $_SESSION['username'] = false;
  10. }
  11.  
  12. }catch (Exception $exc){
  13.  
  14. echo $exc->getMessage();
  15. }
  16.  


chodzi o to że loguje mnie z dowolnym hasłem.

przy rejestracji mam:
  1. function rgisterUser(){
  2.  
  3. $sql = "INSERT INTO users (username, password, email) VALUES (:username,:password,:email)";
  4.  
  5. try{
  6.  
  7. $new_password = password_hash($this->password, PASSWORD_BCRYPT);
  8.  
  9. $query = $this->con->pdo->prepare($sql);
  10.  
  11. $query->bindparam(":username", $this->username);
  12. $query->bindparam(":email", $this->email);
  13. $query->bindparam(":password", $new_password);
  14. $query->execute();
  15.  
  16.  
  17. }catch(Exception $exc){
  18.  
  19. echo $exc->getTraceAsString();
  20. }
  21.  
  22.  
  23. }


Ps. to pilotażowy projekt do nauki PDO, niekomercyjny
nospor
No i jakim cudem ma ci bronic dostepu w przypadku zlego hasla jak jedyne co robisz to wyswietlasz echo ze zle haslo...

Rownie dobrze mozesz zrobic zabezpiecznie antywlamaniowe:
zostaw otwarte drzwi i na kartce tylko napisz: "prosze, nie okradajcie mnie".

Podobny poziom zabezpieczenia co masz teraz w kodzie wink.gif
Pyton_000
Loguje bo dowolny utworzony obiekt zawsze będzie == true.

To co musisz zrobić to w metodzie getData() ustawić jakieś property np. private $logged = ...
do tego jakaś metoda typu isLogged() która zwróci wartość tego property
a na końcu tam gdzie masz swój warunek $login == true zamienić na coś typu if($login->isLogged())
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.