[PHP][MySQL] zmiana hasła zalogowanego usera


(felixik) #1

Witam, rozwijam swój skrypt edytora. Powoli idzie to do przodu, ale napotkałem problem jak dla mnie nie do przejścia. Otóż mam zrobione logowanie gdzie zapamiętuję login usera w sesji i po poprawnym zalogowaniu przekierowuję go header("Location: usermang.php");. W tymże pliku użytkownik ma do wyboru kilka opcji w tym zmianę hasła. I powstają schody. Teoretycznie uporałem się z wyświetleniem opcji dla jednego konkretnie zalogowanego użytkownika, ale za to po kliknięciu w link "zmień hasło" efekt pracy skryptu to pusta strona. Jeśli ktoś mógłby pomóc i przynajmniej naprowadzić lub podać przykład rozwiązania tego problemu to byłbym wdzięczny

usermanag.php

<?


$wynik = mysql_query("SELECT * FROM $tbl_name") or die('Bł±d zapytania');

if(mysql_num_rows($wynik) > 0) {


while($r = mysql_fetch_assoc($wynik))

{

if($_SESSION['user'] == $r['uzytkownik'])

{

   echo"Strona główna |
Edytor podstron |
Zmień hasło |
Wyloguj";

}

    echo '

';

}

}

?>[/code]




sprawdz.php (plik odpowiadający za wyswietlenie formularza)

[code]<? if ($akcja == 'edytuj_usera' and !empty($uzytkownik)) { $wynik = mysql_query("SELECT * FROM $tbl_name") or die('Bł±d zapytania'); $d = mysql_fetch_row($wynik); echo '
-
Użytkownik: Rola: Nowe hasło: '; } ?>


(Pablo_Wawa) #2

Taka uwaga odnośnie bezpieczeństwa - nie przekazuj między skryptami nazwy użytkownika - przecież ją znasz i masz zapamiętaną w sesji - jeszcze ktoś zmieni sobie linka i przez ewentualny błąd w skrypcie będzie miał możliwość podejrzenia lub edycji danych innego użytkownika.

W pliku usermanag.php masz wywołanie skryptu usermanag.php (w linku), ale w kodzie zupełnie tego nie bierzesz pod uwagę.

Zapewne zamiast wywołania usermanag.php miałoby być sprawdz.php?

Poza tym nie widzę w kodzie włączenia sesji (session_start()) - jest automatycznie włączona w konfiguracji PHP?


(slepciu) #3

Włącz wyświetlanie błędów w PHP i zobacz czy coś się wyświetla.

Zamień echo '

' na coś co będzie się wyświetlać i zobacz czy czasem nie trafiasz w to miejsce.

Sprawdź co w danej chwili przechowują zmienne, to może pomóc: http://www.dobreprogramy.pl/slepciu/Sprawdzamy-co-kryja-zmienne-w-PHP,31008.html

No i jak napisał Pablo_Wawa upewnij się, że sesje są włączone, jeśli PHP automatycznie ich nie włącza (w domyślnej konfiguracji tego nie robi) musisz to zrobić w każdym skrypcie na samym początku wywołując session_start()


(Mifczu) #4

Proponuje poczytać więcej o MySQL Przeszukujesz całą tabelę by dopasować jednego użytkownika a jak tych użytkowników będzie milion?

Druga rzecz to, że nadałeś

readonly="readonly"

Nie znaczy, ze nikt tego nie będzie mógł zmodyfikować, mam nadzieję, że nie używasz tych elementów w update do bazy Trzecia rzecz używaj mysql_fetch_assoc czytelniejsze i wygodniejsze. Czwarta banalna :slight_smile: w php cudzysłów " uruchamia coś w rodzaju wyrażeń regularnych by sprawdzić czy nie ma tam zmiennych itp. Zdecydowanie szybsze i zalecane jest używanie pojedynczych ciapek :wink: ' nie musisz wtedy robić \" w HTMLu Zanim zabierzesz się za zrobienie czegoś dużego, polecam poczytać o wzorcach projektowych od MVC zaczynając, o obiektach i na koniec o framworkach do php by nie wywarzać drzwi na nowo :wink: P.S. Twój błąd to:

Zmień hasło |[/code]


chyba chciałeś mieć tam:

[code][Zmień hasło](%5C) |


(felixik) #5

(Pablo_Wawa) #6

Wciąż nie widzisz, gdzie masz błąd (pisałem Ci już o tym) - w linku do zmiany hasła:

Zmień hasło [/code]
masz wywołanie skryptu [b]sprawdz.php[/b], w którym pewnie masz coś źle.

Poza tym wydaje mi się, że źle użyłeś wstawienia wartości zmiennej (tablicy) w tekście - nie chce mi się teraz tego sprawdzać, ale wywołanie powinno chyba mieć postać:

uzytkownik=${r['uzytkownik']}
 - czyli nawiasy {} po znaku $. Poza tym widzę, że używasz zmiennych globalnych - a jak nie, to zapewne masz gdzieś pobranie przesyłanych danych
    $akcja=$_GET['akcja'];
    $edytuj_usera=$_GET['edytuj_usera'];
Sugeruję być sprawdził czy do skryptu zmieniającego dane (hasło) użytkownika poprawnie przekazujesz parametry - np tym kodem:
    echo '

';

print_r($_GET);

echo '
';

Poza tym w pliku sprawdz.php są błędy - co chcesz uzyskać instrukcją
[code]$wynik = mysql_query("SELECT * FROM $tbl_name") or die('Bł±d zapytania');
? Bo tu pobierasz do zmiennej $wynik wszystkie rekordy (wiersze) z danymi o użytkownikach (a nie tylko tego jednego!). Brakuje części

WHERE = $edytuj_usera

, zawężającej pobranie danych tylko dla tego jednego użytkownika.

Poza tym nie powinieneś nazwy użytkownika pobierać z wywołania (przez link), tylko ze zmiennej sesyjnej, bo tak jak teraz masz to ktoś może wpisać dowolnego usera i dostać się do panelu (profilu) np. admina. :stuck_out_tongue:


(felixik) #7

[quote="Pablo_Wawa"] Wciąż nie widzisz, gdzie masz błąd (pisałem Ci już o tym) - w linku do zmiany hasła: Zmień hasło [/code] masz wywołanie skryptu sprawdz.php, w którym pewnie masz coś źle. Poza tym wydaje mi się, że źle użyłeś wstawienia wartości zmiennej (tablicy) w tekście - nie chce mi się teraz tego sprawdzać, ale wywołanie powinno chyba mieć postać:

uzytkownik=${r['uzytkownik']} - czyli nawiasy {} po znaku $. Poza tym widzę, że używasz zmiennych globalnych - a jak nie, to zapewne masz gdzieś pobranie przesyłanych danych$akcja=$_GET['akcja']; $edytuj_usera=$_GET['edytuj_usera']; Sugeruję być sprawdził czy do skryptu zmieniającego dane (hasło) użytkownika poprawnie przekazujesz parametry - np tym kodem:echo ''; print_r($_GET); echo '';

Poza tym w pliku sprawdz.php są błędy - co chcesz uzyskać instrukcją

$wynik = mysql_query("SELECT \* FROM $tbl_name") or die('Bł±d zapytania'); ? Bo tu pobierasz do zmiennej $wynik wszystkie rekordy (wiersze) z danymi o użytkownikach (a nie tylko tego jednego!). Brakuje części WHERE = $edytuj_usera , zawężającej pobranie danych tylko dla tego jednego użytkownika. Poza tym nie powinieneś nazwy użytkownika pobierać z wywołania (przez link), tylko ze zmiennej sesyjnej, bo tak jak teraz masz to ktoś może wpisać dowolnego usera i dostać się do panelu (profilu) np. admina. :P [/quote]
    echo '

';

print_r($_GET);

echo '
';

kod pokazuje:
[code]Array ( [akcja] => edytuj_usera [uzytkownik] => user )

czyli to, co powinien, bo aktualnie zalogowany był "user"

  • jaką zmienną muszę tą część zastąpić? takie z lekka debilne pytanie

(Pablo_Wawa) #8

Jeśli chodzi o fragment zapytania SQL

WHERE = $edytuj_usera

to jest nazwą pola w Twojej bazie danych (chodzi o tabelę $tbl_name) - tam gdzie pamiętasz login użytkownika, którym się w skrypcie posługujesz.


(felixik) #9

Temat do zamknięcia udało mi się ogarnąć problem. Dziękuję za rady