Auto logout als iemand de site verlaat of browser sluit

Status
Niet open voor verdere reacties.

gebruiker78

Gebruiker
Lid geworden
29 jun 2010
Berichten
428
hallo ik heb nu dit in php:
PHP:
//time if they don't do anything log out!
$timeout = 1; // Set timeout minutes
$logout_redirect_url = "index.php"; // Set logout URL
$timeout = $timeout * 60; // Converts minutes to seconds
    if (isset($_SESSION['start_time'])) {
    $elapsed_time = time() - $_SESSION['start_time'];
       if ($elapsed_time >= $timeout) {
       $querychange = mysql_query("
       UPDATE users SET online='0' WHERE email='$email'
       ");
       $querychange = mysql_query("
       UPDATE users SET ip='0' WHERE email='$email'
       ");
       session_destroy();
       header("Location: $logout_redirect_url");
    }
}
$_SESSION['start_time'] = time();

het werkt, als je langer dan 1 min (btw 1min is een test) dan log je auto uit.

maar als je browser sluit of pagina verlaat blijft ip op ip staan en login op 1 staan (inplaats van allebei op 0)
als je dan uiteindelijk weer opnieuw inlogt, logt hij wel weer uit en moet je weer opnieuw inloggen, maar ik wil niet dat als je de pagina verlaat en weer ooooooit terug komt dan pas uitlogt ik wil dat je altijd uitlogt na het verlaten van pagina of sluiten van browser.
dus hoe moet ik zoiets maken? dat hij na het sluiten van browser/pagina ook uitlogt.

ik snap wel de fout, elke keer als je inlogt checkt hij of die 60seconden voorbij zijn. maar ik wil ook dat hij blijft checken en het uitvoert als je de browser/pagina sluit
 
Wat je misschien zou kunnen proberen is een cookie die je door javascript steeds opnieuw laat verlengen als de bezoeken nog op je site is.
Grote nadeel is wel dat het niet werkt als de gebruiker javascript uitzet in zijn browser. Maar het aan hebben staan van javascript zou je misschien een
vereiste kunnen maken om te kunnen inloggen.
Vraag me niet hoe je dat moet doen, het is zomaar een ideetje wat ik kreeg.
 
Gezien de browser dicht is zal de user geen scripts meer aanroepen. Het enige wat je zou kunnen doen is de logout time in de database zetten en met een cronjob al die mensen uitloggen.

Het nadeel is wel dat je dan ook mensen uitlogt die gewoon niet meer op pagina's klikken.

Daarom wordt logged-in status meestal in de $_SESSION gezet. Als iemand zijn browser sluit wordt die automatisch gewist (althans... als hij zijn browser weer opent is de inhoud ervan weg)
 
Gezien de browser dicht is zal de user geen scripts meer aanroepen. Het enige wat je zou kunnen doen is de logout time in de database zetten en met een cronjob al die mensen uitloggen.

Het nadeel is wel dat je dan ook mensen uitlogt die gewoon niet meer op pagina's klikken.

Daarom wordt logged-in status meestal in de $_SESSION gezet. Als iemand zijn browser sluit wordt die automatisch gewist (althans... als hij zijn browser weer opent is de inhoud ervan weg)
bedankt voor de reactie's.
@die vorige, ik werk niet graag met javascript omdat ik een site wil hebben waar iedereen zonder maar iets te doen gelijk werkt.

1. cronjob wil ik niet mee werken.
2. misschein doe ik dan wat verkeerd maar ik heb,
als de gebruiker inlogt: update online naar 1 (i.p.v 0)
uitlogt: update online naar 0 (i.p.v 1)

misschien moet ik dat anders doen? want zou het dan wel werken als ik met true en niet true werk?

het is namelijk dat als iemand nou de browser sluit hij niet meer langs de update naar 0 gaat, dit gebeurd wel als hij meer dan 60sec niks meer doet of op log out klikt.
 
kun je er geen timestamp van maken.

Als iemand anders inlogd dan laat je kijken welke timestamp niet ouder zijn dan bv 60seconden.
 
ik heb het opgezocht,
maar hoe zou dat mij dan automatisch uit kunnen loggen?
 
Ik neem aan dat je het wilt gebruiken om te zien hoeveel mensen er op je site online zijn.
een gebruiker van je site zal nooit op maar een onderdeel blijven van je site.
dus elke keer als hij zich in je site verplaatst, laat je de timestamp updaten
als bewijs dat je nog echt online bent. ook kijk je opdat moment even of de gebruiker niet te lang weg is geweest.
Is hij te lang weggeweest, dan laat je zijn session verdwijnen en hij moet eerst weer opnieuw inloggen.

Iemand die inlogd kijkt naar de timestamp collumn en tel de mensen waarvan de timestamp niet ouder is dan een bepaalde tijd.

Zo zie je wie er binnen (tijd - x) online zijn.

en elke keer na een klik laat je ook die waarde verversen.

in je database staat dan wel een timestamp, maar omdat de timestamp te oude is wordt hij niet gezien als online.
Dus ergo krijgt de status logged out.

en pas las de gebruiker van de oude timestamp de site weer gebruikt, moet hij eerst weer inloggen om een nieuwe timestamp te krijgen.
 
Laatst bewerkt:
ja oke ik snap het maar het probleem ligt hier,
in mijn 'beveiliging' check ik of de gebruiker online is, en of het ip nog overkomt met het ip van de x dat hij inlogte.
inloggen:
update online 1 update ip (gebruiker ip)
uitloggen online 0 ip 0

maar dat doet hij nogsteeds niet op 0 zetten als ik via jouw manier werk, hij moet dus als de tijd op is ook die 2 updaten naar 0
 
dat zou je kunnen doen door gebruik te maken van het inloggen van een ander.
Als van alle timestamp die of NULL of timeout zijn, daar laat je een update uitvoeren in de database dat de door jou gewenste record veranderd worden.
Op deze manier gebruik je eigenlijk je database als login.
weet wel dat het als je veel gebruiker/bezoekers krijg het wel een grote capaciteit vraag van je database.

wat is de bedoeling er achter? dat je op ip controlleer, mag men niet vana af een andere pc inloggen op je site?
 
Zit 't probleem er niet gewoon in dat php serverside is, tevoren of tijdens een sessie werkt, maar niet kan reageren op iets dat clientside gebeurt, en dus niets voor je kan doen op het moment dat iemand een pagina verlaat?

Volgens de eerste hit in www.google.nl/search?q=onunload%28%29+in+php kan het niet zonder javascript: daarmee kan je bv. via AJAX je database laten bijwerken op het moment van afhaken.

Daar lijk me wel wat in te zitten. :)
Dan mis je alleen de bezoekers die javascript uit hebben staan voor de statistieken; zelf kunnen die er na het verlopen van de PHP-session-cookie dan niet meer in komen.

Met vriendelijke groet,
CSShunter
 
bedankt ik zou er naar kijken,
@phobia
uiteindelijke doel is dat er inderdaad veel mensen online kunnen zijn.
de bedoeling achter die ip check is als het ip nogwel het zelfde is als toen ze inlogde (dus als je een hacker hebt dan kan hij er niet in want het ip (van gebruiker inlog) komt niet overeen met die van hem)

en als jij zegt dat het wel vrij veel vraagt van mijn database als ik het op deze manier doe hoe kan ik het dan doen?
deze 2 dingen had ik namelijk voor beveiliging, maar wat voor beveiliging kan ik anders doen die minder van mijn database vraagt?

werkt dit misschien?
- inplaats van database te updaten gewoon met session's werken.
bij het inloggen een session maken van online naar 1 en ip vastleggen en dan elke 'beveiligde' pagina checken of die nog hetzelfde is?
dan gaan na een tijdje automatisch die session's toch weg?


ik heb het even uitgevoert en is dit veilig?
bij het inloggen:
$_SESSION['online']=1;

bij een member only page:
$online = $_SESSION['online'];

if (isset($online)==1){
// blabla
}


en als ik dat dan ook doe met ip adres, is dat dan een veilige manier om in teloggen en te checken of hij wel is ingelogd en het ip adress wel klopt?
 
Laatst bewerkt:
Dat is inderdaad wel veilig. Wat ik ook nog zou doen is niet alleen 'online' opslaan maar ook het gebruikers-id, zodat je ook weet wíe er ingelogd is. Dat kan handig zijn bij het tonen van gebruiker-specifieke informatie.
 
Volgens mij is het toch niet makkelijk om een session te hacken.
en je zou een cookie met een unieke key en met de ip kunnen weg schrijven naar de gebruiker
(cookie is clientside) en die steeds controleren tegen de session, waar je dezelfde gegevens opslaat(session is serverside)
Want dan moet een hacker de browser en de server moeten hacken om de gegevens te misbruiken te misbruiken.

En voor het ingelogd zijn van mensen op je site kun je online verschillende scripts vinden.
 
oke harstikke bedankt!,
het is wel bedoeld voor "grote" doeleinde dus wil ik dat van het laatste bericht wel toepassen (sorry, ik kan je naam even niet zien)

maar kunt u/je beter uitleggen wat je/u bedoelt?
link naar iets of voorbeeld is ook goed
 
je maak tijdens het inloggen een
$_SESSION['login']['key']
$_SESSION['login']['ip']
$_SESSION['login']['userId']
aan
en gelijk doe maak je ook
$_COOKIE['login']['key']
$_COOKIE['login']['ip']
$_COOKIE['login']['userId']
$_COOKIE['login']['time']
Time gebruik je om te kijken of de gebruiker wel actief is.
Dus als hij bv 10minuten nix gedaan heeft is zijn sessie verlopen en moet hij zich opnieuw inloggen.
Bij elke keer als hij op een button klikt laat je de time cookie controleren of de sessie verlopen is.
is de sessie niet verlopen is, dan vernieuw je de time.
Ook controleer je of de $_SESSION gegevens verder overeen komen met de $_COOKIE gegevens.
(Dit is om de hackers te weren)

Ipv de time cookie kun je ook een tijd instellen in de cookie dat hij in de browser moet blijven bestaan,
nadeel is dan wel weer dat een hacker daar toegang toe heeft en de tijd zou kunnen manipuleren.
 
oke bedankt!
maar nu kom ik "klein" probleembje tegen.

want hoe laat ik nu zien aan andere of de gebruiker online is of niet?
zodat ik bijvoorbeeld een lijst met gebruikers heb die online zijn.

ik heb wel even gegoogled maar ik denk data ik dan toch weer via database moet werken.
of kan het nog via sessions?
 
Laatst bewerkt:
verander je script naar dit:

//time if they don't do anything log out!
$timeout = 1; // Set timeout minutes
$logout_redirect_url = "index.php"; // Set logout URL
$timeout = $timeout * 60; // Converts minutes to seconds
if (isset($_SESSION['start_time'])) {
$elapsed_time = time() - $_SESSION['start_time'];
if ($elapsed_time >= $timeout) {
mysql_query("
UPDATE users SET online='0' WHERE email='$email'
");
mysql_query("
UPDATE users SET ip='0' WHERE email='$email'
");
session_destroy();
header("Location: $logout_redirect_url");
}
}
$_SESSION['start_time'] = time()

Dat zou moeten werken:)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan