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

skuteczne wylogowanie

0 głosów
169 wizyt
pytanie zadane 6 lipca 2019 w PHP przez borygooo Początkujący (320 p.)
Mam w php system logowania na kontoskładający sie ze strony logowanie.php gdzie wpisuje sie login i hasło
oraz ze strony konto.php gdzie po poprawnym zalogowaniu pokazuje sie zawartość. Jest tam też odnośnik "wyloguj" który przerzuca użytkownika do logowanie.php. Jeśli by wtedy wpisac w pasku adresu konto.php nie zostaniemy wpuszczeni bo na początku jest if statement który przerywa skrypt jesli brak zmiennej $_POST['haslo'] lub $_POST['logi'].
Jeśli jednak po wylogowaniu cofnę się strzałką przegladatki do poprzedniej strony i odświeżę konto.php pokazuje mi się zawartość. Jakim kodem zabezpieczyć taką sytuację?

Krzysiek
komentarz 7 lipca 2019 przez borygooo Początkujący (320 p.)
Bardzo dziękuję  wszystkim za odpowiedzi i mam pytanie poboczne związane z tematem odnośnie zmiennych sesyjnych. Przegryzam się przez temat i zauważyłem że Zalent ustanawia zmienną np $_SESSION['zalogowany']=true a potem ustawia warunek if ((isset($_SESSION['zalogowany']))  &&( $_SESSION['zalogowany']=true) ). Po co uzywać drugiego warunku: "$_SESSION['zalogowany']=true" skoro nie zmienia on w kodzie wartości tylko robi unset całej sesji lub zmiennej. Czyliwarunikiem jest istnienie lub nie zmiennej sesyjnej, ponieważ zaś żeby ustawić zmienną trzeba podac jej wartość stąd została podana wartość true.
komentarz 7 lipca 2019 przez Chess Szeryf (76,770 p.)

Coś chyba pomyliłeś. Powinno być raczej

if(isset($_SESSION['log']) && $_SESSION['log']==true) // ...

Dwa "==", a nie jedno "=". Na początku gdzieś w kodzie pewnie ustawia $_SESSION['log']=true; - inicjalizacja zmiennej na daną wartość. Później można sprawdzić, czy ta zmienna istnieje i czy ma wartość true. Jeśli tak, to wtedy wykonaj coś tam.

komentarz 7 lipca 2019 przez borygooo Początkujący (320 p.)
Oczywiście powinno byc "==", sorki. Moje pytanie brzmi po co sprawdzać warunek czy zmienna ma wartość true zamiast sprawdzać tylko czy istnieje. Nigdzie w kodzie nie ma zmiany wartości zmiennej na inną, jest tylko ustanawianie zmiennej lub usuwanie zmiennej (set/unset) więc drugi warunek wydaje sie być bez sensu. To mnbie nurtuje
komentarz 7 lipca 2019 przez Chess Szeryf (76,770 p.)

Nie wiem, jak wygląda cały kod, ale możliwe, że akurat, to co mówisz jest prawdą, że sprawdzanie, że $_SESSION['log']==true; mija się z celem/nie jest potrzebne. Wyobraź sobie sytuację, kiedy $_SESSION['log'] przybierałaby dwie wartości: online, offline. I teraz, jeśli by się nie przyrównało w warunku, czy $_SESSION['log']==true, to wtedy nie byłoby wiadomo, czy ten użytkownik jest online, czy offline, ponieważ ta zmienna i tak istnieje, nie ważne z jaką wartością. Dla zobrazowania kod poniżej.

if(isset($_SESSION['log']) && $_SESSION['log'] == true) {
  echo 'User is online.';
} else if(isset($_SESSION['log']) && $_SESSION['log'] == false) {
  echo 'User is offline.';
}

lub

if(isset($_SESSION['log']) && $_SESSION['log'] == 'online') {
  echo 'User is online.';
} else if(isset($_SESSION['log']) && $_SESSION['log'] == 'offline') {
  echo 'User is offline.';
}

Gdybyś napisał tak

if(isset($_SESSION['log'])) {
  echo // ...
} // ...

to skąd by się wiedziało, czy użytkownik jest zalogowany, czy nie skoro ta zmienna istniałaby dla zarówno wartości np. true jak i false.

Jeśli zaprojektowałoby się ten mechanizm, że jeśli sesja istnieje - zalogowany, nie istnieje - niezalogowany, to nie trzeba byłoby tego drugiego warunku pisać z $_SESSION['log'] == true.

Jeśli chodzi o kod z filmu Zelenta, to możliwe, że ten warunek nie jest w ogóle potrzebny, ale to musiałbyś sam zweryfikować i ten kod przeanalizować.

komentarz 7 lipca 2019 przez borygooo Początkujący (320 p.)
Wielkie dzięki. Zatem wydaje sie że się nie myliłem uważając że drugi warunek jest bez sensu bo w istocie zalent proponuje taki mechanim "że jeśli sesja istnieje - zalogowany, nie istnieje - niezalogowany". Kodu nie podam bo to w dwu plikach jest ale jest to pokzane dokładnie tu i głowiłem sie nad tym o co tu chodzi.

od momentu ponizej 2 minuty
https://youtu.be/Pp578w7C9hE?t=4164

od momentu ponizej piewrsza minuta
https://youtu.be/Pp578w7C9hE?t=4442
komentarz 7 lipca 2019 przez Chess Szeryf (76,770 p.)

"że jeśli sesja istnieje - zalogowany, nie istnieje - niezalogowany"

Jeśli tak jest jak opisałeś w tym kodzie, to te przyrównanie jest raczej niepotrzebne (na filmik na youtube spojrzałem pobieżnie). Chyba, że ktoś chciałby w przyszłości rozbudować skrypt i zostawiłby tak tę zmienną przyrównaną, to czemu nie.

W skrócie. Jeśli to działa na zasadzie zniszczenia sesji i wtedy będzie user niezalogowany i utworzenia sesji - zalogowany, to tak ten warunek drugi w if jest niepotrzebny. Jest tak dlatego, że mechanizm ten opiera się o znieszczenie sesji, a nie o sprawdzenie konkretnych wartości pochodzących ze zmiennej sesyjnej.

Trzeba tylko pamiętać o tym, że żeby pisało niezalogowany musisz zniszczyć sesję $_SESSION['zalogowany'], a nie tylko zmienić wartość tej sesji na np. false ($_SESSION['zalogowany'] = false), bo wtedy to nie zadziała zgodnie z zamierzeniem.

2 odpowiedzi

+2 głosów
odpowiedź 6 lipca 2019 przez HaKIM Szeryf (87,770 p.)

Masz źle zaprojektowany system autoryazcji. Co zrobisz w przypadku posiadania więcej stron niżeli konto.php, które wymagają autoryzacji? Przekażesz $_POST z konto.php na np. dashboard.php?

Przerzuć się na sesje. Gdy już to zrobisz, przycisk wylogowania nie będzie tylko przekierowywał na stronę logowania, co jest drugorzędną funkcjonalnością, ale też usuwał sesję zalogowanego użytkownika.

https://www.php.net/manual/en/reserved.variables.session.php

https://www.developerdrive.com/adding-a-simple-authentication-using-php-require-and-includes/ <- Poradnik. Jakość kodu jest bardzo kiepska, dlatego skup się na działaniu sesji w przykładach z tego posta i zrób to jak należy.

0 głosów
odpowiedź 7 lipca 2019 przez mrspock1 Mądrala (6,400 p.)
Sesja jest potrzebna między innymi po to, żeby zsynchronizować obie części aplikacji internetowej (w tym wypadku w postaci strony dynamicznej) klient-serwer. Nie można dopuścić żeby ktoś na przeglądarce połączył się z sesją innego użytkownika na serwerze. Synchronizacji dokonuje się przez zapisanie w obu częściach programu numeru sesji. Może to być robione na trzy sposoby.

jako tak zwane ciasteczka
jako numer przekazywany w adresie strony, parametr na końcu
jako pole ukryte zmiennej formularza

Najbardziej podoba mi się sposób trzeci, bo nie zmuszasz użytkownika do używania ciasteczek, co do których są podejrzenia że służą do śledzenia działań użytkownika. Nieprzyjemne jest gdy serwer wymusza ciasteczka dając komunikat "włącz ciasteczka bo inaczej się nie zalogujesz".

Podobne pytania

0 głosów
2 odpowiedzi 197 wizyt
0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 15 grudnia 2017 w PHP przez Bartess Gaduła (3,600 p.)
0 głosów
1 odpowiedź 667 wizyt
pytanie zadane 7 września 2017 w PHP przez kevin Mądrala (5,010 p.)

89,082 zapytań

137,669 odpowiedzi

307,605 komentarzy

59,140 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...