Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: poprawne wylogowanie z aplikacji
Forum PHP.pl > Forum > PHP
morrison
witam,

zrobiłem aplikacje, ale mam jeszcze problem z poprawnym wylogowaniem usera. otoz usuwam sesje poprawnie, ale gdy user sie wyloguje to kiedy wciska wstecz w przegladarce(raz w IE lub kilka razy w firefox) to udaje mu sie wrocic do autoryzowanej strony i zobaczyc zawartosc. co prawda gdy prubuje wtedy kkliknac cos to wyrzuca go z powrotem do strony wylogowania. ale i tak jest zle.

jaki jest sposob zeby usunac z przegladarki te dane aby juz nie mogl ich zobaczyc user po wylogowaniu?
wipo
Trzeba wyczyścić cache w przeglądarce
morrison
wydaje sie sluszne, ale jak to mozna zrobic?
wipo
Zdalnie to zdaje mi się że się nie da
morrison
jest wiele komercyjnych aplikacji w php np. gdzie zostal rozwiazany ten problem. pytanie wiec: jak to zrobic?
Jarod
Cytat(morrison @ 25.01.2007, 15:33:18 ) *
jest wiele komercyjnych aplikacji w php np. gdzie zostal rozwiazany ten problem. pytanie wiec: jak to zrobic?

W aplikacji, którą pisałem nie mogłem pozwolić na nieautoryzowany dostęp. Problem rozwiązałem w następujący sposób. Na początku pliku z kontrolerem wywołuję plik:
  1. <?php
  2. require_once('verify.php');
  3. ?>


Zawartość pliku verify:
  1. <?php
  2.  
  3. //**************************************************
  4. //** Skrypt weryfikujący zalogowanie w systemie
  5. //**************************************************
  6.  
  7. require_once('function.php');
  8. require_once('config.inc.php');
  9.  
  10.  
  11.  
  12. // JEŚLI NIE ISTNIEJE SESJA UŻYTKOWNIKA TO POWRÓT NA STRONĘ LOGOWANIA
  13. if ( (!isset($_SESSION['LOGIN'])) && (!isset($_SESSION['HASLO'])) )
  14. {
  15. ?>
  16. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  17. <html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl">
  18.  
  19. <head> 
  20. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  21. <meta http-equiv="Content-language" content="pl" />
  22. <meta name="Description" content="Firma X" />
  23. <meta name="Author" content="Sebastian Sowiński" />
  24. <meta name="Robots" content="all" />
  25. <meta name="Pragma" content="no-cache" />
  26. <meta name="Cache-Control" content="no-store, no-cache, must-revalidate" />
  27. <link rel="stylesheet" href="css/authorization.css" type="text/css" />
  28.  
  29. <title>DOSTĘP WZBRONIONY</title>
  30. </head>
  31. <body>
  32.  
  33. <div id="log">
  34. <img class="stop" src="img/stop.gif" width="83px" height="83px" alt="Stop" name="Stop" border="0" />
  35. <p class="brakautoryzacji">Nie masz uprawnień !</p>
  36. </div>
  37.  
  38. </body>
  39. </html>
  40.  
  41. <?php
  42. // Logowanie operacji
  43. if ( $trybLogowania > 0 ) dodajLog($sciezkaDoPlikuZlogami,'SYSTEM','Możliwa próba obejścia zabezpieczeń - nieudana weryfikacja !!!');
  44.  
  45. echo '<META HTTP-EQUIV='Refresh' CONTENT='4; URL=index.php'>';
  46. exit();
  47. }
  48. ?>


Sprawdza się znakomicie.
morrison
hm. rozumiem ze ten kod:
  1. <?php
  2. echo '<META HTTP-EQUIV='Refresh' CONTENT='4; URL=index.php'>';
  3. exit();
  4. ?>


rozwiazuje caly problem. sprawdze jak tylko bede mogl,dzieki!:)
Jarod
Cytat(morrison @ 25.01.2007, 15:48:04 ) *
hm. rozumiem ze ten kod:
  1. <?php
  2. echo '<META HTTP-EQUIV='Refresh' CONTENT='4; URL=index.php'>';
  3. exit();
  4. ?>


rozwiazuje caly problem. sprawdze jak tylko bede mogl,dzieki!:)



Zamień exit() na die(); winksmiley.jpg
W pliku index.php jest kod odpowiedzialny za autoryzację. Tzn formularz itp.. Najważniejsze jest to, że jak sprawdzisz, że sesja nie istnieje to przekierowujesz.
pzdr
morrison
zrobilem cos takiego, ale nie dziala:
  1. <?php
  2. /* sprawdza za kazdym wykonaniem czy w ostatnich 10min user korzystal z aplikacji
     jesli nie to nastepuje automatyczne wylogowanie
  3.  * jesli user sie dopiero zalogowal to pobiera nazwe i haslo, jesli jest juz zal
    ogowany to sprawdza czy dane sa poprawne
  4.  * ustawia czas waznosci sesji
  5.  */
  6. function check_login() {
  7.  
  8. //sprawdzamy i ustawiamy czas waznosci sesji
  9. $_SESSION['intTimeoutSeconds'] = 600; //ustaw sekundy do timeout'u 600 = 10min
  10. if(isset($_SESSION['intLastRefreshTime'])) {
  11. if(($_SESSION['intLastRefreshTime'] + $_SESSION['intTimeoutSeconds']) < time()) {
  12. print '<META HTTP-EQUIV="Refresh" CONTENT="5"; URL="logout.php">';
  13. header('Location: logout.php');
  14. }
  15. }
  16. $_SESSION['intLastRefreshTime'] = time();
  17.  
  18. //utworzenie krotkich nazw zmiennych i spr. czy dane sa przek. w zm. sesji
  19. if (!isset($_SESSION['user_name']))
  20. $_SESSION['user_name'] = @$_POST['user_name'];
  21. if (!isset($_SESSION['password_']))
  22. $_SESSION['password_'] = @$_POST['password_'];
  23.  
  24. // jesli uzytkownik znajduje sie w bazie danych rejestracja identyfikatora
  25. if (loguj($_SESSION['user_name'], $_SESSION['password_'])) {
  26. $_SESSION['uwierz_uzyt'] = $_SESSION['user_name'];
  27. //sprawdzenie czy zalogowany posiada prawa admina czy zwyklego usera
  28. $connect = lacz_bd();
  29. $query = "select admin from cms_users where user_name='".$_SESSION['user_name']."'";
  30. $result = mysql_query($query, $connect);
  31. $_SESSION['admin'] = mysql_result($result, 0, 0);
  32.  
  33. } else { // nieprawidlowe logowanie
  34. print '<META HTTP-EQUIV="Refresh" CONTENT="5"; URL="logout.php">';
  35. header('Location: logout.php');
  36. exit();
  37. }
  38.  
  39. session_register('czas_zalogowania_test');
  40. if($_SESSION['czas_zalogowania_test'] == false){
  41. session_register('czas_zalogowania');
  42. $_SESSION['czas_zalogowania'] = date("H:i:s a");
  43. $_SESSION['czas_zalogowania_test'] = true;
  44. }
  45.  
  46. }
  47. ?>

ogolnie moze to nie pasuje do mojego skryptu...
Jarod
<OT>Po co używasz znaku małpy w zapisach:
  1. <?php
  2. $_SESSION['password_'] = @$_POST['password_'];
  3. ?>
:]</OT>


Ja w swoim skrypcie sprawdzam czy w sesji istnieje zapisany login i hasło. Jeśli tak - użytkownik jest zalogowany. Jeśli nie - wylogował się. Jeśli się wylogował (czyt. w zmiennej sesyjnej nie ma zapisanego loginu i hasła) to jeśli próbuje się dostać do innych podstron/akcji/plików jest kierowany na stronę logowania (po krótkim czasie na przeczytanie "brak dostępu" etc.).
W funkcji, którą podałeś nie dopatrzyłem się żebyś to sprawdzał w sposób, który podałem niżej.
morrison
@ - uzywam poniewaz gdy za pierwszym razem wykonuje sie ta funkcja, czyli kiedy user wysyla formularz z loginem i haslem to wtedy do zmiennych podstawiaja sie te dane. potem gdy juz sa ustawione te zmienne i nie ma nic w POST @ powoduje ze nie wyswietla sie notice z brakiem wartosci w POST.

moja funkcja "loguj" sprawdza za kazdym razem uwierzytelnienie w bazie.

natomiast to:
  1. <?php
  2. print '<META HTTP-EQUIV="Refresh" CONTENT="5"; URL="logout.php">';
  3. ?>

nie powoduje u mnie przejscia do wskazanej strony, lecz caly czas przeladowuje sie pusta strona.

byc moze to ze podstawiam dane z POST do hasla i loginu zawsze kiedy te zmienne sesyjne sa puste powoduje ze przegladarka wchodzi wstecz do autoryzowanej strony...? no ale tak juz to skonstruowalem. pytanie co powinienem poprawic
Jarod
Przyjrzyj się jeszcze raz jak ja to zrobiłem.
  1. <?php
  2. if ( (!isset($_SESSION['LOGIN'])) && (!isset($_SESSION['HASLO'])) )
  3. {
  4. //tutaj jakiś komunikat...
  5. echo '<META HTTP-EQUIV='Refresh' CONTENT='4; URL=index.php'>';
  6. die();
  7. }
  8. ?>

Ja podczas logowania ustawiam zmienne sesyjne LOGIN i HASŁO i tylko je sprawdzam, bo jeśli istnieją tzn że użytkownik jest zalogowany. W tym co Ty podałeś można się pogubić. Teraz nie mam za bardzo czasu ale jutro sobie ten kod sformatuje i oblukam. Ewidentnie masz gdzieś błąd.. U mnie naciskanie przycisku wstecz nic nie da ba za każdym razem na samym początku skryptu sprawdzane jest czy istnieje sesja jeśli nie to jest przekierowywany na stronę logowania. W ten sposób też nie obejdziesz logowania (nie odpalisz ręcznie żadnej podstrony systemu bez hasła bo dostaniesz ostrzeżenie i zobaczysz stronę logowania - sprawdzano winksmiley.jpg)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.