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

password_verify nie działa php pdo

Object Storage Arubacloud
+1 głos
144 wizyt
pytanie zadane 9 marca 2021 w PHP przez niezalogowany

Witam mam problem z weryfikacją hasła za pomocą funkcji password_verify w metodzie logowania czy ktoś może mi podpowiedzieć gdzie leży problem 

Oto moja metoda rejestracji 

 public function Registerion(array $date): void // Metoda która sprawdza czy dany użytkownik został zarejestrowany
    {
            $email = $this->conn->quote($date['email']);
            $NazwaUzytkownika = $this->conn->quote($date['NazwaUzytkownika']);
            $haslo = $this->conn->quote($date['Haslo']);
            $PowtorzHaslo = $this->conn->quote($date['PowtorzHaslo']);
            $Imie = $this->conn->quote($date['Imie']);
            $Nazwisko = $this->conn->quote($date['Nazwisko']);
            $Numer = $this->conn->quote($date['Numer']);
            $Panstwo = $this->conn->quote($date['Panstwo']);
            $Miasto = $this->conn->quote($date['Miasto']);
            $Wybor = $this->conn->quote($date['Wybor']);
            $KodPocztowy = $this->conn->quote($date['KodPocztowy']);
            if(isset($email))
            {
                // Walidajca danych powiodła się
		        $ok = true;
                $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

                if(empty($email))
                {
                    $_SESSION['email_provided'] = $_POST['email']; // zmienna sesyjna podaje nieprawidłowy email
                    header('Location: /?action=Rejestracja'); 
                    $ok = false; 
                }

                $NazwaUzytkownika = filter_input(INPUT_POST, 'NazwaUzytkownika');
                if((strlen($NazwaUzytkownika) < 3) || (strlen($NazwaUzytkownika) > 20)) {
                    $ok = false;
                    $_SESSION['name_user'] = $_POST['NazwaUzytkownika']; // Sprawdzenie długości znaków Nazwa Uzytkownika
                    header('Location: /?action=Rejestracja');
                }
                $NazwaUzytkownika = filter_input(INPUT_POST, 'NazwaUzytkownika');
                if(ctype_alnum($NazwaUzytkownika)==false) {
                    $ok = false;
                    $_SESSION['not_polish_user'] = $_POST['NazwaUzytkownika']; // Nazwa użytkownika ma składać się tylko z liter i cyfr (bez polskich znaków)
                    header('Location: /?action=Rejestracja');
                }
                $Haslo = filter_input(INPUT_POST, 'Haslo');
                $PowtorzHaslo = filter_input(INPUT_POST, 'PowtorzHaslo');
                /* Przyda się do sprawdzania hashy
		        $hash_hasla = password_hash($hasloOne, PASSWORD_DEFAULT);
		        echo $hash_hasla; exit();
		        */
                if((strlen($Haslo)< 8) || (strlen($Haslo) > 20))
                {
                    $ok = false;
                    $_SESSION['one_password'] = $_POST['Haslo']; // Hasło musi posiadać od 8 do 20 znaków!
                    header('Location: /?action=Rejestracja');
                } 
                if($Haslo!=$PowtorzHaslo)
                {
                    $ok = false;
                    $_SESSION['same_password'] = $_POST['Haslo']; // Podane hasła nie są identyczne!
                    header('Location: /?action=Rejestracja'); 
                } 
                $hash_hasla = password_hash($Haslo, PASSWORD_DEFAULT);
                $Imie = filter_input(INPUT_POST, 'Imie');
                if(!preg_match('/^[a-ząćęłńóśźż]+$/ui',$Imie))
                {
                    $ok = false;
                    $_SESSION['name_field'] = $_POST['Imie']; // Wprowadzanie Imienia
                    header('Location: /?action=Rejestracja');
                }
                $Nazwisko = filter_input(INPUT_POST, 'Nazwisko');
                if(!preg_match('/^[a-ząćęłńóśźż]+$/ui',$Nazwisko))
                {
                    $ok = false;
                    $_SESSION['surname_field'] = $_POST['Nazwisko']; // Wprowadzenie Nazwiska
                    header('Location: /?action=Rejestracja'); 
                }
                $Numer = filter_input(INPUT_POST, 'Numer');
                if(!preg_match('/^[0-9]{9,13}$/',$Numer))
                {
                    $ok = false;
                    $_SESSION['number_field'] = $_POST['Numer']; // Wprowadzenie Numeru Telefonu
                    header('Location: /?action=Rejestracja'); 
                }
                $Panstwo = filter_input(INPUT_POST, 'Panstwo');
                if(!preg_match('/^[a-ząćęłńóśźż]+$/ui',$Panstwo))
                {
                    $ok = false;
                    $_SESSION['country_field'] = $_POST['Panstwo']; // Wprowadzenie Państwa w którym użytkownik się znajduje 
                    header('Location: /?action=Rejestracja'); 
                }
                $Miasto = filter_input(INPUT_POST, 'Miasto');
                if(!preg_match('/^[a-ząćęłńóśźż]+$/ui',$Miasto))
                {
                    $ok = false;
                    $_SESSION['city_field'] = $_POST['Miasto']; // Wprowadzenie Miasta przez użytkownika
                    header('Location: /?action=Rejestracja'); 
                } 
                // Jakie województwo
                $Wybor = filter_input(INPUT_POST, 'Wybor');
                // Jaki kod pocztowy
                $KodPocztowy = filter_input(INPUT_POST, 'KodPocztowy');
                if(empty($KodPocztowy)) {
                    $ok = false;
                    $_SESSION['post_office'] = $_POST['KodPocztowy']; // Wprowadzenie kodu pocztowego 
                    header('Location: /?action=Rejestracja');
                }
                $results = $this->conn->query("SELECT id FROM uzytkownicy WHERE NazwaUzytkownika='$NazwaUzytkownika'");
                $howMuchUser = $results->rowCount();
                if($howMuchUser > 0) 
                {
                    $ok = false;
                    $_SESSION['exist_user'] = $_POST['NazwaUzytkownika']; // Czy istnieje już taki użytkownik w bazie 
                    header('Location: /?action=Rejestracja'); 
                } 
                $result = $this->conn->query("SELECT id FROM uzytkownicy WHERE email='$email'");
                $howMuchEmail = $result->rowCount();
                if($howMuchEmail > 0)
                {
                    $ok = false;
                    $_SESSION['exist_mail'] = $_POST['email']; // Czy istnieje użytkownik o taki emailu
                    header('Location: /?action=Rejestracja'); 
                }
                
                if($ok==true)
                {
                    $query = "INSERT INTO uzytkownicy VALUES(NULL, '$email', '$NazwaUzytkownika', '$hash_hasla', '$Imie', '$Nazwisko', '$Numer', '$Panstwo', '$Miasto', '$Wybor', '$KodPocztowy')";
                    $this->conn->exec($query);
                }
            }
    }

Oto moja metoda logowania 

 public function Logged(): void // Metoda która sprawdza czy dany użytkownik został zalogowany
    {
        if(!isset($_SESSION['ID_LOGGED'])) {
            if(isset($_POST['NazwaUzytkownika'])) {
                $NazwaUzytkownika = filter_input(INPUT_POST, 'NazwaUzytkownika');
                $haslo = filter_input(INPUT_POST, 'Haslo');
                $query = $this->conn->prepare('SELECT id, Haslo FROM uzytkownicy WHERE NazwaUzytkownika = :NazwaUzytkownika');
                $query->bindValue(':NazwaUzytkownika', $NazwaUzytkownika, PDO::PARAM_STR);
                $query->execute();
                $user = $query->fetch();
                if($user && password_verify($haslo,$user['Haslo'])) // Jeżeli login istnieje i dla tego rekordu hasło zgadza się z tym które mamy zahaszowane w bazie to oznacza że użytkownik zalogował się poprawnie 
                {
                    $_SESSION['ID_LOGGED'] = $user['id'];
                    unset($_SESSION['failed_attempt']); // Usuwanie już nieprawidłowego logowania
                } else {
                    $_SESSION['failed_attempt'] = true; // Nieudana próba logowania 
                    header('Location: /?action=Logowanie');
                    exit();
                }
            }
        }

        if(isset($_SESSION['ID_LOGGED'])) 
        {
            header('Location: /?action=Zalogowany');
            exit();
        }
    }

Gdyby ktoś jeszcze potrzebował tutaj jest funkcja z kontrolera 

public function ZalogowanyAction(): void
    {
        if($this->request->hasToPost()) {
            $Data = [
                'NazwaUzytkownika' => $this->request->postIndex('NazwaUzytkownika'),
                'Haslo' => $this->request->postIndex('Haslo'),
            ];
            $this->database->Logged($Data);
        }

        $this->view->displaytwo('Zalogowany', $viewParams ?? []);
    }
public function hasToPost(): bool
    {
        return !empty($this->post); // Zwróci wartość prawdziwą jeżeli to nie będzie post 
    }

 

komentarz 9 marca 2021 przez niezalogowany
przeniesione 9 marca 2021 przez Arkadiusz Waluk
Tutaj mam taki błąd
TypeError Object
(
    [message:protected] => password_verify() expects parameter 1 to be string, null given
    [string:Error:private] => 
    [code:protected] => 0
    [file:protected] => C:\xampp\htdocs\StronaInternetowa\src\Database.php
    [line:protected] => 254
    [trace:Error:private] => Array
        (
            [0] => Array
                (
                    [file] => C:\xampp\htdocs\StronaInternetowa\src\Database.php
                    [line] => 254
                    [function] => password_verify
                    [args] => Array
                        (
                            [0] => 
                            [1] => $2y$10$oilbg.crjt.GtfioOcuvuOK767E9nNmwJzOi5h0RIic4pAjr9gGxG
                        )

                )

            [1] => Array
                (
                    [file] => C:\xampp\htdocs\StronaInternetowa\src\Controller\ShopController.php
                    [line] => 68
                    [function] => Logged
                    [class] => App\Database
                    [type] => ->
                    [args] => Array
                        (
                            [0] => Array
                                (
                                    [NazwaUzytkownika] => Buczek123
                                    [Haslo] => 
                                )

                        )

                )

            [2] => Array
                (
                    [file] => C:\xampp\htdocs\StronaInternetowa\src\Controller\AbstractController.php
                    [line] => 56
                    [function] => ZalogowanyAction
                    [class] => App\Controller\ShopController
                    [type] => ->
                    [args] => Array
                        (
                        )

                )

            [3] => Array
                (
                    [file] => C:\xampp\htdocs\StronaInternetowa\index.php
                    [line] => 31
                    [function] => execute
                    [class] => App\Controller\AbstractController
                    [type] => ->
                    [args] => Array
                        (
                        )

                )

        )

    [previous:Error:private] => 
)
komentarz 9 marca 2021 przez Lavaganza Użytkownik (660 p.)

W requescie masz metode isPost() po co ci funkcja hasToPost ?

if ( $this->getRequest()->isPost() ) 

No i karygodny blad jesli kiedys pokazesz komus kod z polskimi nazwami to nikt cie nie. przyjmie. Co to te dzieciaki dzisiaj robia w tych kodach, jezuuu

komentarz 9 marca 2021 przez niezalogowany
Dzięki za radę

1 odpowiedź

0 głosów
odpowiedź 9 marca 2021 przez niezalogowany

W błędzie jest informacja że funkcja password_verify jako pierwszy parametr potrzebuje string a nie null.

[message:protected] => password_verify() expects parameter 1 to be string, null given

Sprawdź co masz w zmiennej haslo.

komentarz 9 marca 2021 przez niezalogowany

$haslo = filter_input(INPUT_POST, 'Haslo');

Tutaj struktura

Tutaj są moje wiersze w tabeli 

1
komentarz 9 marca 2021 przez niezalogowany
Dane z posta nie mają nic wspólnego z bazą danych. Sprawdził bym raczej formularz.

Podobne pytania

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ź 399 wizyt
pytanie zadane 5 listopada 2022 w PHP przez zbiku25 Bywalec (2,940 p.)
0 głosów
0 odpowiedzi 203 wizyt
pytanie zadane 20 maja 2022 w PHP przez AnimaVillis Stary wyjadacz (11,350 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!

...