[php] automatyczne wylogowanie użytkownika

0

Witajcie.
Mam napisany skrypt który automatycznie wylogowuje użytkownika i niszczy sesję i robi unsety dla jej zmiennych... wszystko działa dopty dopóki użytkownik nie zamknie przeglądarki "iksem" bez wylogowania się samemu.. Owszem mam zrobione że jak się skończy czas sesji to ma go wylogować i wyloguje go ze strony, lecz miałem zrobione zabezpieczenie z którego nie chciałbym zrezygnować ale w obecnej sytuacji muszę. Otóż wykonuję sobie zapytanie do bazy dodające session_id dla użytkownika który się loguje, a usuwa je z bazy gdy user sam się wyloguje, lub nie zamknie przeglądarki i będzie nieaktywny przez określony przeze mnie czas. I to działa znakomicie, bo jak ma przeglądarkę to po określonym czasie nieaktywności robię refresha strony z zapytaniem usuwającym sess_id i wylogowującym usera. A zalogować pozwala tylko wtedy kiedy pole session_id jest w bazie puste (czyli użytkownik teoretycznie się wylogował - zabezpieczenie żeby nie był zalogowany na innych komputerach lub przeglądarkach kilka razy, lub ktoś się za niego nie zalogował jeśli on jest zalogowany. Zabezpieczenia przed wykradnięciem sesji mam zrobione swoją drogą i tu ono nie ma nic do rzeczy :P).

Lecz jak ktoś zamknie przeglądarkę to owszem wyloguje go jak czas sesji się skończy, ale nie wykona zapytania...czyli session_id w bazie nadal jest i nie pozwoli się zalogować temu użytkownikowi mimo iż był wylogowany... Więc muszę chwilowo rezygnować z tego rozwiązania...
]Macie jakiś pomysł jak zrobić aby to zapytanie się wykonywało mimo iż użytkownik zamknął stronę i go wylogowało po wygaśnięciu sesji? Lub może macie inny pomysł na niepozwolenie multilogowania dla tego samego użytkownika?
pozdrawiam i czekam na pomoc;)

0

np:

dodaj 2 pola w tabeli w bazie danych:
session_active INT defalut 0
session_ip varchar (16)

przy logowaniu sprawdzasz:

  • jeżeli sesja nie była aktywna w trakcie ostatnich 5 min( session_active + 300 < mktime() ) to zaloguj, jeżeli podał poprawne dane
  • jeżeli sesja była aktywna, to sprawdź session_ip, jeżeli jest takie samo jak logujący się ludek to go wpuść, jeżeli nie, to masz multilogowanie

po poprawnym zalogowaniu musisz nadpisać session_active i session_ip
i dodatkowo powinieneś od czasu do czasu robić update session_active
np po udanym zalogowaniu ustaw jeszcze
$_SESSION['check_active'] = mktime() + 150;

i przy każdym odświeżeniu strony możesz sprawdzać

if($_SESSION['check_active'] + 300 < mktime()){
   //wyloguj, minęło 5minut 
} elseif($_SESSION['check_active'] + 150 < mktime()){
   //przedłuż sesję i zapisz do bazy
   $_SESSION['check_active'] = mktime() + 150; 
   mysql_query(  tutaj sobie robisz update session_active ustawiając aktualny czas, czyli, że aktywna);
} else {
   //przedłuż sesję
   $_SESSION['check_active'] = mktime() + 150; 
}

to tak trochę z palca (z komórki) pisane, więc lepiej sprawdź czy jest ok

oczywiście to tylko propozycja

ja osobiście zapisuję sobie w momencie rejestracji adres ip dla każdego użytkownika i jemu daję priorytet logowania, wylogowując wszystkich, jeżeli gość loguje się z rejestracyjnego adresu IP ;]

przykład
zakładam konto w domu, więc mój rejestracyjny adres IP to ten z domu
jeżeli ktoś zaloguje się w świecie na moje konto i będzie miał non stop aktywną sesję, czy bota napisze, żeby mi utrudnić dostęp do konta to go wywali w momencie, gdy będę logował się z domu, bo moje domowe IP ma priorytet

0

Nie mktime, tylko time.

session_start();
///...
if (time() > $_SESSION['last_activity'] + 60*5) {
   $_SESSION = array();
} else {
   $_SESSION['last_activity'] = time();
}

czyli session_id w bazie nadal jest i nie pozwoli się zalogować temu użytkownikowi mimo iż był wylogowany...

Wywalić to zabezpieczenie, bo i tak nie ma sensu... Ewentualnie jak loguje się drugi user to wyrzucasz wpis z sesją tego pierwszego.

0

mialem tak na zasadzie ktora wlasnie podal Demonical Monk, wiec nic nowego sie nie dowiedzialem :P


$timeout = 1200; //20 minut

if (isset($_SESSION['ostatni_refresh'])) {

    if (($_SESSION['ostatni_refresh'] + $timeout) < time()) {

        if (isset($_SESSION["login"])) {
            $EBAND->UpdateSessId("", $_SESSION["login"]);
            session_destroy();
            unset($_SESSION["login"]);
            unset($_SESSION["czy_admin"]);
            unset($_SESSION["avt_id"]);
            session_start();
            ob_start();
            $_SESSION["zalogowany"] = 0;
        }
    }
}
$_SESSION['ostatni_refresh'] = time();


i wlasnie to dziala ale nie robi mi zapytania do bazy jak user nie ma otwartej strony w przegladarce mimo braku jego aktywnosci... tu lezy problem... wiem czy powyzsze rozwiazanie z 2 polami tez nie zadziala bo zapytania beda w tym samym miejscu...

bo jesli uzytkownik ma otwarta strone w przegladarce to to dziala, ale nie dziala juz gdy uzytkownik zamknie strone iksem bez wylogowania...

owszem wyloguje uzytkownika ze strony ale nie nadpisze session_id w bazie... i tu lezy problem...

spróbuje pokombinować wg Arisa, ale jak macie jakieś inne pomysły to z chęcią poczytam ;)

0

Aris, pomogła mi twoja propozycja ;)
z tym że jedna poprawka jest potrzebna w Twoim kodzie ;) (oczywiście u mnie się mocno rozbudował dość)

aby poprawnie odczytywało z bazy czas ostatniej aktywności to przy przedłużeniu sesji zapisujemy nie time() + ileś tam sekund czy minut (w twoim przypadku

elseif($_SESSION['check_active'] + 150 < time()){
   //przedłuż sesję i zapisz do bazy
   $_SESSION['check_active'] = time() + 150; 
   mysql_query(  tutaj sobie robisz update session_active ustawiając aktualny czas, czyli, że aktywna);
}

tylko sam time, bo inaczej można zalogować się później o ten właśnie dodany do time czas przedłużenia sesji ;)
czyli kod wyglądać powinienby tak:

Aris, pomogła mi twoja propozycja ;)
z tym że jedna poprawka jest potrzebna w Twoim kodzie ;) (oczywiście u mnie się mocno rozbudował dość)

aby poprawnie odczytywało z bazy czas ostatniej aktywności to przy przedłużeniu sesji zapisujemy nie time() + ileś tam sekund czy minut (w twoim przypadku

elseif($_SESSION['check_active'] + 150 < time()){
   //przedłuż sesję i zapisz do bazy
   $_SESSION['check_active'] = time() ; 
   mysql_query(  tutaj sobie robisz update session_active ustawiając aktualny czas, czyli, że aktywna);
}

dzięki za podpowiedź rozwiązania ;) pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1