logout mit session_destroy()
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
browser
check
code
datum
erneut senden
formular
geschlossenen tab
header
inhalt
klicken
login
machen
post
problem
sekunde
session
stehen
url
verhindern
wiederherstellen
-
hi,
ich habe ein login, bei dem funktioniert soweit alles
bis auf dass, wenn ich nach dem ausloggen im Browser auf zurück klicke,
sehe ich immernoch die Inhalte die man eigentlich nur eingeloggt sehen darf
habe es mit unset und destroy versucht, aber da liegt glaube ich nicht das problem...
<?php session_start(); session_destroy(); session_unset(); $_SESSION['Username'] = null;
das habe ich vor dem Text stehen, es soll eigentlich genau mein Problem verhindern, macht es aber nicht :(
if(!isset($_SESSION["Username"]) || !$_SESSION["Username"]) { echo 'du bist eingeloggt'; } else { echo 'du musst dich erst einloggen'; }
das ist das einzige was ich dazu gefunden habe.
den machern der tutorials war es anscheinend egal um ihre Dateien, hauptsache ausgeloggt...
naja ich will mich mal nicht beschweren ^^
grüße
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das liegt daran, dass der Browser beim zurück klicken nicht unbedingt die Seite neu läd, sondern nur die Seite aus dem Cache anzeigt. Drückst du zurück und dann F5, wirst du feststellen, dass du ausgeloggt bist.
-
danke für deine Antwort,
aber das ist ja eben das, was ich nicht möchte.
ich möchte entweder den Cache beim ausloggen löschen
oder beim backwarding nicht aus dem cache sondern neu vom Server laden...
ist zwar netzlastig aber wäre ja dumm wenn man nach dem Ausloggen
immernoch private Daten des Nutzers einlesen kann...
<meta http-equiv="expires" content="0">
ist die einzige lösung die ich gefunden habe,
aber irgendwie passiert einfach nur nix ...
(der code kommt in den Header) -
Hallo
hier mal ein kleines Login / Logout PHP-Script mit session()
... ist aber nur zum "testen" ... trotz Session und MD5 mit Salt ist es nicht "wirklich" sicher.
(man könnte / sollte die Eingaben ($_REQUEST Daten) noch prüfen / filtern / schützen ...)
Das Passwort ist: test123
<?php // ------------------------------------------------------------ header('Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0'); header('Pragma: no-cache'); // ------------------------------------------------------------ session_start(); $adm_pwd = 'test123'; $saltkey = 'jK3zi8mWx9oyPc'; $sec_pwd = md5($adm_pwd.$saltkey); if (!empty($_REQUEST['pwd'])) { $xgo_pwd = md5($_REQUEST['pwd'].$saltkey); if ($xgo_pwd == $sec_pwd) { $_SESSION['xpw'] = $xgo_pwd; } else { $_SESSION['xpw'] = 'x'; } } if (!empty($_REQUEST['act'])) { $go_act = $_REQUEST['act']; } else { $go_act = 'home'; } if ($go_act == 'logout') { session_unset(); session_destroy(); } // ------------------------------------------------------------ ?> <html> <head> <title>Admin</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body style="background:#EEEEEE; color:#000000;"> <br> <br> <?php // ------------------------------------------------------------ print "<p>Aktuelle Aktion: <strong>".$go_act."</strong></p>\n"; if (isset($_SESSION['xpw']) && $_SESSION['xpw'] == $sec_pwd) { // ------------------------------------------------------------ ?> <p> --- <a href="?act=start">HOME</a> --- <a href="?act=new">NEW</a> --- <a href="?act=edit">EDIT</a> --- <a href="?act=logout" style="color:#CC0000;">LOGOUT</a> --- </p> <?php // ------------------------------------------------------------ } else { // ------------------------------------------------------------ ?> <br> <br> <form name="form1" method="post" action=""> Passwort: <input type="text" name="pwd" size="24"> <input type="hidden" name="act" value="login"> <input type="submit" name="go" value="LOGIN"> </form> <br> <br> <?php // ------------------------------------------------------------ } if (isset($_SESSION['xpw']) && $_SESSION['xpw'] == 'x') { print "<p>... falsches Passwort .... </p>\n"; } // ------------------------------------------------------------ ?> <br> <br> <br> </body> </html>
Erklärung:
Wenn man nicht ein-geloggt ist, wird das Login-Formular angezeigt,
... wenn Login Passwort richtig ist, dann ein Menü (inkl. Logout-Link)
Bei "klick" auf den Logout-Link wird die Session gelöscht und beendet.
... das Cache-Problem kannst Du durch setzen eines NO-CACHE header() lösen.
hoffe das hilft weiter :)
Beitrag zuletzt geändert: 19.9.2013 15:55:34 von emoebel -
Hat mir schonmal weiter geholfen:
<?php header('Cache-Control: private, no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0'); header('Pragma: no-cache'); session_start(); ?> <html><head>
allerdings weist es immernoch Fehler auf, habs mehrmals getestet und bin nach dem Ausloggen immernoch durch klicken auf zurück auf einige Seiten (nicht bei allen) als angemeldet gekommen...
als würde er nicht den ganzen cache löschen, oder Seiten beim Löschen überspringen...
-
Du kannst beim ausloggen mit einem Location Header auf eine andere Seite umleiten. mit dem zurückpfeil des Browsers wird man aber immernoch manchmal inhalte sehen können, dies kannst und solltest du auch nicht verhindern, schließlich bekommt der user ja nur noch mal das angezeigt, was er schon gesehen hat und keine aktuellen Informationen.
md5 ist übrigens nicht für passwortverschlüsselung geeignet, weil es recht leich knackbar ist, es ist nur für die Erstellung von Prüfwerten gedacht, benutze besser hash() mit sha. -
<?php header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); session_start(); ?> <html><head>
Das funktioniert, ich idiot hatte davor noch ein Kommentar stehen...
die Verschlüsselung hatte ich schon vorher mit sha-512
$user_pw = hash("sha512", $user_pw);
schließlich bekommt der user ja nur noch mal das angezeigt, was er schon gesehen hat und keine aktuellen Informationen.
das ist richtig, aber was, wenn der PC von mehreren Leuten genutzt wird und du nicht daran denkst deinen Browser zu schließen...
die können dann ganz einfach mit "geschlossenen Tab wiederherstellen" und dem "Zurück" ganz leicht die Daten sehen.
Thema ist damit geschlossen -
tft-development schrieb:
... und du nicht daran denkst deinen Browser zu schließen...
man kann mit JavaScript das aktuelle Fenster bei Logout schließen
if ($go_act == 'logout') { session_unset(); session_destroy(); print '<script type="text/javascript"> window.close(); </script>'."\n"; }
ok, dann kann man mit "geschlossenen Tab wiederherstellen" evtl doch wieder auf die Seite,
aber bei meinen Tests war nach Logout auch bei "Zurück im Browser" kein Login mehr aktiv ?!
das passiert nur, wenn man soweit zurück geht, bis "Formular erneut senden" kommt,
wenn man das macht, dann loggt man sich erneut ein ... hmm ok
IDEE .... man könnte bei Login noch einen TimeStamp übergeben,
und wenn dieser dann älter als paar Sekunden ist, dann den Login nicht zulassen.
$time_stamp = time(); if (!empty($_REQUEST['pwd']) && !empty($_REQUEST['xtm'])) { $xgo_pwd = md5($_REQUEST['pwd'].$salt); $logtime = $_REQUEST['xtm']; if ($xgo_pwd == $sec_pwd && ($time_stamp-30) < $logtime) { $_SESSION['xpw'] = $xgo_pwd; } else { $_SESSION['xpw'] = 'x'; } }
und im Login-Formular
print '<br />'."\n"; print '<br />'."\n"; print '<form name="form1" method="post" action="index.php">'."\n"; print ' Passwort: <input type="text" name="pwd" size="24" />'."\n"; print ' <input type="hidden" name="xtm" value="'.$time_stamp.'" />'."\n"; print ' <input type="hidden" name="act" value="login" />'."\n"; print ' <input type="submit" name="go" value="LOGIN" />'."\n"; print '</form>'."\n"; print '<br />'."\n"; print '<br />'."\n";
damit ist das "erneut senden" bei Browser-Zurück nach 30 Sekunden nicht mehr als Login gültig.
Beitrag zuletzt geändert: 23.9.2013 12:29:50 von emoebel -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage