Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP PDO password_verify nie działa
alberthus
post 5.12.2017, 11:30:17
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 16.01.2014

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
nospor
post 5.12.2017, 11:33:01
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




$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()


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
alberthus
post 5.12.2017, 12:11:06
Post #3





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 16.01.2014

Ostrzeżenie: (0%)
-----


Pod $this->password siedzi to co wpiszę w formularzu logowania. Wyżej jest przekazywane.

I jak dalej?
Go to the top of the page
+Quote Post
viking
post 5.12.2017, 12:13:27
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 5.12.2017, 12:43:28
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Tylko broń cie panie nie próbuj robić password_hash i tego porównywać gdziekolwiek...
Go to the top of the page
+Quote Post
alberthus
post 5.12.2017, 12:46:58
Post #6





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 16.01.2014

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował alberthus 5.12.2017, 12:48:56
Go to the top of the page
+Quote Post
viking
post 5.12.2017, 12:49:26
Post #7





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował viking 5.12.2017, 12:50:04


--------------------
Go to the top of the page
+Quote Post
alberthus
post 19.06.2018, 20:09:55
Post #8





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 16.01.2014

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
Pyton_000
post 21.06.2018, 07:27:07
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


No i? Teraz kod jest ok więc może oświecisz co nie działa.
Go to the top of the page
+Quote Post
alberthus
post 21.06.2018, 19:13:53
Post #10





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 16.01.2014

Ostrzeżenie: (0%)
-----


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.  


Ten post edytował alberthus 21.06.2018, 19:19:49
Go to the top of the page
+Quote Post
Pyton_000
post 21.06.2018, 20:09:00
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
alberthus
post 22.06.2018, 14:46:37
Post #12





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 16.01.2014

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
nospor
post 22.06.2018, 14:53:28
Post #13





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pyton_000
post 22.06.2018, 15:08:45
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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())
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 14:42