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

Błąd w kodzie na zmianę hasła

Object Storage Arubacloud
0 głosów
285 wizyt
pytanie zadane 10 lipca 2019 w PHP przez Patryk Kacprowicz Nowicjusz (230 p.)

Witajcie,

 

Zmagam się z problemem w kodzie na zmianę hasła, czy mógłby ktoś pomóc? Kod jest zmodyfikowanym kodem na logowanie, który pewnie wszyscy znacie (kod Pana Mirosława Zelenta).

 

#EDIT

 

Dodam tylko że hasło jest hashowane wcześniej

 

if($wszystko_OK == true) {
                if ($rezultat = @$polaczenie->query(
                    sprintf("SELECT * FROM `users` WHERE id='%s'",
                        mysqli_real_escape_string($polaczenie, $_SESSION['id'])))) {
                    $ilu_userow = $rezultat->num_rows;
                    if ($ilu_userow > 0) {
                        $wiersz = $rezultat->fetch_assoc();
                        if (password_verify($old_pass, $wiersz['pass'])) {
                            $rezultat->free_result();
                            $connect = mysqli_connect($host, $db_user, $db_password);
                            $id = $_SESSION['id'];
                            $zmiana = mysqli_query($connect, "UPDATE `users` SET `pass` = '$new_pass' WHERE id = '$id'");
                            $connect->close();
                            header ("Location: wyloguj.php");
                    } else {
                            $_SESSION['blad'] = 'Nieprawidłowy login lub hasło!';
                            header('Location: settings.php?error=1');
                        }
                    } else {
                        $_SESSION['blad'] = 'Nieprawidłowy login lub hasło!';
                        header('Location: settings.php?error=1');
                    }
                }
                $polaczenie->close();
            }

Nie wiem, co jest nie tak, także czy ktoś bardziej doświadczony mógłby rzucić okiem?

 

PS. Tak wiem, że lepsze jest PDO, jednakże nie ogarniam go totalnie i mimo poradnika Pana Zelenta nadal nie ogarniam, w dodatku ten sam kod, który jest na odcinku u mnie nie działa.. ;c

1 odpowiedź

+2 głosów
odpowiedź 10 lipca 2019 przez OdsetekGlupoty Pasjonat (15,360 p.)
edycja 10 lipca 2019 przez OdsetekGlupoty

Witam,

Aby kod zadziałał, z kwerendy UPDATE usuń apostrofy. To załatwi sprawę, ale mam kilka zastrzeżeń:

  • Jeśli łączysz się z bazą obiektowo przy logowaniu, to dlaczego później przy zmianie hasła robisz nie nieobiektowo (mysqli_query)? 
  • Zamiast mysqli_real_escape_string(), używaj Prepared Statements.
  • W żaden sposób nie zabezpieczasz kwerendy UPDATE, zmienne są gołe, to umożliwia wstrzyknięcie SQLa. 
  • Poradniki Pana MZ są świetnie zrobione, ale kod, który pisze w swoich poradnikach (przynajmniej w PHP) jest słabej jakości.
  • Jesteś trochę niekonsekwentny - raz w headerze używasz cudzysłowa, raz apostrofów, do tego wstawiasz spacje w różne miejsca, gdzie indziej już tego nie robisz.
  • Dobrze formatujesz kod, plus za to. 
komentarz 11 lipca 2019 przez Mariusz08 Maniak (62,300 p.)
  • Zamiast mysqli_real_escape_string(), używaj Prepared Statements.

 Tak wiem, że lepsze jest PDO, jednakże nie ogarniam go totalnie

 

  • W żaden sposób nie zabezpieczasz kwerendy UPDATE, zmienne są gołe, to umożliwia wstrzyknięcie SQLa. 

To już wina MZ że tworzy kod bez zabezpieczenia go i publikuje go dalej w Sieci.

 

komentarz 11 lipca 2019 przez OdsetekGlupoty Pasjonat (15,360 p.)

Mysqli też obsługuje Prepared Statements

To już wina MZ że tworzy kod bez zabezpieczenia go i publikuje go dalej w Sieci

MZ stosuje przynajmniej te mysqli_real_escape_string(), a autor w ogóle nie zabezpiecza kodu. 

komentarz 11 lipca 2019 przez Rocket Gaduła (3,030 p.)

@Mariusz08, wina leży po stronie tego który mając świadomość błędów konsekwentnie je bagatelizuje.

 

Poza zwykłym htmlspecialchars czy preparowaniu zapytania, dobrze jest sprawdzić również czy jego typ nie uległ zmianie i ew. długość nie przekracza ograniczeń narzucanych przez bazę.

komentarz 12 lipca 2019 przez Patryk Kacprowicz Nowicjusz (230 p.)

@OdsetekGlupoty, Kod zabezpieczam wcześniej przed łączeniem z bazą, kod będzie i tak ulepszany a teraz jest taki jaki jest aby chociaż działało (wiem, jest to złe podejście i to bardzo złe)

 

Kod nadal nie działa

 

if ($rezultat = @$polaczenie->query(
                    sprintf("SELECT * FROM `users` WHERE id='%s'",
                        mysqli_real_escape_string($polaczenie, $_SESSION['id'])))) {
                    $ilu_userow = $rezultat->num_rows;
                    if ($ilu_userow > 0) {
                        $wiersz = $rezultat->fetch_assoc();
                        if (password_verify($old_pass, $wiersz['pass'])) {
                            $rezultat->free_result();
                            $connect = mysqli_connect($host, $db_user, $db_password);
                            $id = $_SESSION['id'];
                            $zmiana = mysqli_query($connect, "UPDATE users SET pass = '$new_pass' WHERE id = '$id'");
                            $connect->close();
                            header ("Location: wyloguj.php");
                        } else {
                                $_SESSION['blad'] = 'Nieprawidłowy login lub hasło!';
                                header('Location: settings.php?error=1');
                            }
                    } else {
                        $_SESSION['blad'] = 'Nieprawidłowy login lub hasło!';
                        header('Location: settings.php?error=1');
                    }
                }

Ja coś chyba źle robię.. ;c

komentarz 12 lipca 2019 przez OdsetekGlupoty Pasjonat (15,360 p.)
edycja 12 lipca 2019 przez OdsetekGlupoty
No, na pewno coś źle robisz ;)

Gdzie wybierasz bazę danych w mysqli_connect()? Nie wyświetlił Ci się żaden błąd?

Mówiłem o usunięciu apostrofów, ty usunąłeś grawisy, ale nevermind, apostrofy mogą zostać. Sorry za wprowadzenie w błąd.
komentarz 12 lipca 2019 przez Patryk Kacprowicz Nowicjusz (230 p.)
Nie ma błędu, nie wybieram bazy, przy kwerendzie jest `users`
komentarz 12 lipca 2019 przez Patryk Kacprowicz Nowicjusz (230 p.)
Dobra, jestem głupi, dodanie $db_name załatwiło sprawę... Masz najlepszą odpowiedź i dziękuję za poświęcony czas :D

Podobne pytania

+1 głos
3 odpowiedzi 4,123 wizyt
pytanie zadane 25 czerwca 2017 w Systemy operacyjne, programy przez Mich Początkujący (340 p.)
0 głosów
1 odpowiedź 795 wizyt
pytanie zadane 10 sierpnia 2017 w PHP przez ldybiec Nowicjusz (190 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...