[MySQL][PHP] Zmiana Hasła

Witam

 

 

Tworze sobie pewną stronkę. Aktualnie pracuje nad funkcją zmiany hasła…

nie jest to dokładnie to o co pytasz, ale możesz to zrobić jednym zapytaniem:

mysqli_query($polacz,"UPDATE users SET haslo = md5('$haslo'), haslo2 = md5('$haslo') WHERE id_usera = '$id_uzyt'");

btw Tu masz chyba źle:

$haslo = htmlspecialchars(mysqli_real_escape_string($polacz,$_POST['haslo']));
$nhaslo = htmlspecialchars(mysqli_real_escape_string($polacz,$_POST['nhaslo']));
$nhaslo2 = htmlspecialchars(mysqli_real_escape_string($polacz,$_POST['nhaslo2']));

Po co ci zmienna $polacz  tutaj?

 

Edit3 

Widzę błąd

$id_uzyt to nie jest string tylko obiekt  i musisz pobrać daną  z tego obiektu:

np tak:

$row = mysqli_query($polacz,"SELECT id_usera FROM users WHERE login ='{$_COOKIE['login']}'");
$id_uzyt = $row['id_uzyt'];

zmiast

mysqli_query($polacz,"UPDATE users SET haslo = md5('$haslo') WHERE id_usera = '$id_uzyt'");

zrób

mysqli_query($polacz,"UPDATE users SET haslo = md5($haslo) WHERE id_usera = $id_uzyt");

albo

$pass =md5($haslo);
mysqli_query($polacz,"UPDATE users SET haslo = $pass WHERE id_usera = $id_uzyt");

MD5? Serio?

 

 

 

Jesli nie mam dwóch argumentów wywala błąd. Jest to zapewne związane z poleceniami ‘mysali’.

 

Ale razem z $polacz jest OK. Puki co udało się ominąć błąd.

 

 

Teraz kombinuje z samym updateowaniem - baza pozostaje bez zmian mimo iż na stronce ‘udało się’ zmienić . Robiłem kilka wersji, teraz wpadłem na takie coś.

$row = mysqli_query($polacz,"SELECT id_usera FROM users WHERE login ='{$_COOKIE['login']}'");
$zmn = mysqli_fetch_row($row);

Zrobiłem to w ten sposób, mysqli_fetch_row z definicji zapisuje wynik do tablicy wynikowej, ale jako że $zmn nie jest tablicą powinno poskutkować.

 

Moje uwagi:

zapytanie bezpośrednio w bazie działa prawidłowo?

skoro warunki są spełnione i wyświetla się komunikat, że dane zostały zmienione, to przyczyn szukaj albo w połączeniu z bazą albo w samym zapytaniu. Nie sprawdzałem, ale na pierwszy rzut oka nie pasuje mi:

mysqli_query($polacz,"UPDATE users SET haslo = $has WHERE id_usera = $id_uzyt");

raczej zrobiłbym to w taki sposób:

mysqli_query($polacz,'UPDATE users SET haslo = "'.$has.'" WHERE id_usera= '. $id_uzyt);

a jeżeli dalej nie zadziała to sprawdź co przechowuje zmienna $has.

Niestety ten sposób też nie działa.

 

$has - to tylko hasło z md5. Testowałem echo’em co pokaże mi hasło z bazy, hasło które podaje oraz potwierdzenie hasła. Tam wszystko się zgadza.

 

W przypadku rejestracji mam taki kod - wszystko działa poprawnie.

mysqli_query($polacz,"INSERT INTO users (imie,nazwisko,login,email,haslo) VALUES('$imie','$nazwisko','$login','$email',md5('$haslo'))"); 

Działa bez zarzutu. Połączenie jest ok, bo mogę się logować i rejestrować.

mysqli_query($polacz,"UPDATE users SET haslo = md5('$haslo') WHERE id_usera= $id_uzyt");

po pierwsze, składniowo tu jest błąd, w poście wyżej napisałem poprawne rozwiązanie, które właśnie sprawdziłem i działa, po drugie - $haslo to jest w formularzu obecne hasło (zapisane w bazie), więc on tym update’m nadpisuje te hasło, które już jest zapisane, innymi słowy, nie $haslo a $nhaslo.

mysqli_query($polacz,'UPDATE users SET haslo = "'.md5($nhaslo).'" WHERE id_usera= '. $id_uzyt);

i jak już wcześniej wspomniałem:

$loginzm = $_COOKIE['login'];

taki pomysł jest zupełnie nietrafiony.

 

 

Dzięki! Działa. Użyłem Twojego rozwiązania już wcześniej ale nie działało… ponieważ jak zauważyłeś, miałem hasło zamiast nhasło. Ciekawe jak długo walczyłem z wiatrakami o.O

powalcze z $_COOKIE[‘login’]; i już będzie to trochę lepiej funkcjonowało :slight_smile:

Jeśli jeszcze mogę prosić, gdybyś zerknął na całość kodu - wcześniej pisałeś o bałaganie - więc prosił bym jeszcze o jakieś wskazówki, co powinienem okroić, zmienić itp :slight_smile:

Po pierwsze, warto oddzielić warstwę prezentacji od warstwy logiki aplikacji. Jeżeli masz formularz w HTML + obsługę w PHP to robiąc dołączanie plików PHP w środku formularza + wypisywanie błędów przez funkcję robi bałagan w kodzie. Tu akurat masz w miarę prosty przykład, ale w większych projektach ciężko by było się w tym połapać.

 

W pliku z formularzem, na początku zrobiłbym:

<? include('_funkcje/zmiana.php') ?>

Drugą sprawą jest działanie samej tej funkcji. Funkcja powinna zwracać jakąś wartość a nie wykonywać wypisywanie błędów. To znaczy, jeżeli masz sprawdzanie błędów, powinno wyglądać to np. tak:

if($old_password != $old_db_password){
     return array('error' => 1, 'code' => '1', 'msg'=> $messages['incorrect_old_password']);
}
if($new_password != $new_password2){
     return array('error' => 1, 'code' => '2', 'msg'=> $messages['passwords_are_different']);
}
...

w pliku z funkcją zmiany hasła zrobiłbym również obsługę:

if(isset($_POST['change_password_form'])){
  $cp = zmien($_POST);
}else{
  $cp = null;
}

i potem w miejscu formularza, gdzie ma wyświetlać się komunikat błędu zrobiłbym:

<? if($cp): ?>
   <p class="<?= $cp['error'] == 1 ? 'error' : 'ok' ?>"><?= $cp['msg'] ?></p>
<? endif ?>

Kolejną sprawą jest rażące w oczy wykorzystanie zmiennej globalnej $_COOKIE do sprawdzenia loginu i próby zmiany hasła. Wykorzystaj tablicę $_SESSION, po to to jest.

 

Następnie wykonywanie zapytań do bazy:

$zapyt = mysqli_query($polacz,"SELECT id_usera, haslo FROM users WHERE login = '$loginzm'");

znowu się uczepie tego $_COOKIE. Co w przypadku jak sobie jako wartość ciasteczka ‘login’ wpiszę coś na wzór:

testuser; drop table users;

zmieni się wóczas hasło testuser a następnie wykona się polecenie usunięcia tabeli z użytkownikami. Typowy przykład SQL Injection. Nie widzę, żeby zmienna $id_uzyt była gdzieś w jakikolwiek sposób filtrowana. Zapoznaj się z biblioteką PDO dla PHP, jest prosta i pozwala na konstruowanie zapytań poprzez bindowanie parametrów pochodzących od użytkownika i konstruowanie bezpiecznych zapytań do bazy danych.

 

MD5 jak ktoś wyżej wspomniał, zamieniłbym na coś mocniejszego + dodanie soli.

 

Buforowanie ob_start() nie sądzę, żeby Ci tu było potrzebne.

 

Wyrażenia regularne z eregi są przestarzałe w wersji PHP>5.3. Użyj preg_match.

 

Warto by to było robić w pełni obiektowo.

 

To chyba tyle co udało mi się wychwycić, to jest oczywiście moja koncepcja pisania kodu w tym języku i zdaję sobie sprawę, że nie każdy się ze mną musi zgadzać.

Ok, dzięki :slight_smile: Sam problem został rozwiązany.

 

Teraz pobawię się w kodzie i myślę że za jakiś czas postaram się wrzucić wyniki :slight_smile: