PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Session Cookie löschen.


DuRa
27.01.2011, 07:50
Hallo alle zusammen!

Und zwar habe ich ein Problem mit dem löschen des Sessioncookies.
Er hat den Namen PHPSESSID und ist gültig bis zum Ende der Session.
Aber wenn ich die Funktion logoutUser aufrufe, erstellt er einen neuen gültigen Cookie.
Ich poste einfach mal meinen Codeschnipsel und hoffe dass ich hier Hilfe bekomme.


function updateUser()
{
$_SESSION['logged'] = true;
$_SESSION['user'] = $_POST['user'];
return true;
}




function logoutUser()
{
session_start();
if(isset($_COOKIE[session_name()]))
{
setcookie(session_name(),"",time()-4200);
session_destroy();
header("location: login.php");
exit;
}
}


Danke schonmal im vorraus.

phpBuddy
27.01.2011, 13:41
Hallo DuRa,

willkommen im Forum. Wenn eine neue Session erstellt wird, wird irgendwo ein session_start() aufgerufen. Prinzipiell ist da auch gar nichts schlimmes dabei. Hast Du mal geprüft was in dem Cookie und in der Session steht, nachdem es neu angelegt wurde? Wenn der User ausgeloggt ist, ist doch alles okay, auch wenn ein neues, leeres Session Cookie angelegt wird. Das wird ohnehin beim schließen des Browser gelöscht.

DuRa
27.01.2011, 13:58
Hallo phpBuddy,
danke für die schnelle Antwort.
Also in der Session bzw im Cookie stehen die variable $_SESSION['logged'] = true; und der username. Das Problem ist, dass kein leeres Cookie erstellt wird, sondern wenn ich danach die "geheime" Seite wieder aufrufe, ich immer noch eingeloggt bin. Das ist das Problem an der Sache. An sich stört mich das Cookie auch nicht, nur die Tatsache, das man bei erneutem aufrufen der Seite, nach dem Logout, immer noch eingeloggt ist.

phpBuddy
27.01.2011, 14:28
Beim setzen des Cookie sollte man auch einen entsprechenden Namen verwenden und nicht unbedingt den Name der Session. Dann gibt es da auch keine Probleme ein Cookie gezielt anzusprechen.
Hast Du mal mit var_dump geschaut ob überhaupt ein entsprechendes Cookie mit dem Namen vorhanden ist? Und vor allem auch, ob es irgendwo unbeabsichtigt wieder neu gesetzt wird?

DuRa
27.01.2011, 15:12
Das Problem an der Sache ist, dass ich den Cookie nicht explizit setze, sondern er automatisch mit der Session gesetzt wird. Auch wenn ich einen Cookie mit explizitem Namen setze, wird zwar dieser korrekt gehandhabt, jedoch wird der Cookie mit der PHPSESSID trotzdem noch gesetzt. Nach dem Einloggen sowie nach dem ausloggen, habe ich mal den Cookie mit var_dump ausgegeben und er hat den gleichen Wert. Soll ich dir mal meinen kompletten Sourcecode posten, damit man eventuell den Fehler an einer anderen Stelle suchen/finden kann ?

phpBuddy
27.01.2011, 15:18
Soll ich dir mal meinen kompletten Sourcecode posten, damit man eventuell den Fehler an einer anderen Stelle suchen/finden kann ?

Schaden kann das nicht, wa?! ;)

Versuch mal noch vor das session_destroy() ein $_SESSION = array(); zu setzen. Das überschreibt die Session mit einem leeren Array, so das alle Daten darin gelöscht werden. Trotzdem, das PHPSESSID ist mehr oder weniger ein "reservierter" Name, der für die PHP-eigenen Sessions verwendet wird. Wenn man manuell Cookies anlegt, um darin z.B. Logindaten abzulegen, sollte man immer einen eigenen Namen verwenden und nicht den für Sessions reservierten von PHP. Hast Du das mal versucht und geschaut was dabei heraus kommt?

DuRa
27.01.2011, 15:35
Also auch mit dem $_SESSION = array(); kam keine Veränderung.
Eigentlich wollte ich weniger mit den Cookies arbeiten sondern mehr mit den Sessions, da ja eigentlich die ganze Authentifizierung über MySQL läuft.

Zum Code:
(wunder dich nicht wenn dir einiges bekannt vorkommt, hab mir einiges aus deinem Tut abgeschaut ;) Dennoch wollte ich lieber selbst ein Loginscript schreiben, die dazugehörige Registrierung funktioniert auch schon einwandfrei.)

Die Funktionen:

<?php

function db_connect()
{

include("vars.inc.php");

$con = mysql_connect($dbhost, $dbuser, $dbpass) or die("Keine Verbindung zum Datenbankserver!" . mysql_error());

if(is_resource($con))
{
mysql_select_db($dbname, $con) or die("Keine Verbindung zur Datenbank!" . mysql_error());
}
return $con;
}

function addUser($user, $pass, $hash, $con)
{
$sql = "INSERT INTO `login` (`id`, `username`, `password`, `activated`, `pass_hash`)
VALUES (NULL, '".mysql_real_escape_string($user)."', '".mysql_real_escape_string($pass)."', 1, '".mysql_real_escape_string($hash)."');";
$result = mysql_query($sql, $con);
if ($result == 1)
{
return true;
}
else
{
return false;
}
}

function cleanInput()
{
//Wenn maskierende Slashes vorhanden sind, entfernen.
if (get_magic_quotes_gpc() == 1)
{
$input['user'] = stripslashes($_POST['user']);
$input['pass'] = stripslashes($_POST['pass']);
}
//Ansonsten normal ins Array übergeben.
else
{
$input['user'] = $_POST['user'];
$input['pass'] = $_POST['pass'];
}

//Trimmen
$input['user'] = trim($input['user']);
$input['pass'] = trim($input['pass']);

//Username in Kleinbuchstaben umwandeln.
$input['user'] = strtolower($input['user']);

//Array wieder ausgeben.
return $input;
}

function loginUser($user, $pass, $con)
{
$sql = "SELECT `pass_hash` FROM `login` WHERE LOWER(`username`) = '".mysql_real_escape_string($user)."' AND `activated` = 1";
$result = mysql_query($sql, $con);

if(mysql_num_rows($result) == 1)
{
$data = mysql_fetch_array($result);
mysql_free_result($result);
$hash = $data['pass_hash'];
$loginpw = md5($pass . $hash);

$sql = "SELECT `id` FROM `login` WHERE LOWER(`username`) = '".mysql_real_escape_string($user)."' AND password = '".mysql_real_escape_string($loginpw)."' AND `activated` = 1";
$result = mysql_query($sql, $con);
if (mysql_num_rows($result) == 1)
{
return true;

}
else
{
return false;
}
}
}

function updateUser()
{
$_SESSION['logged'] = true;
$_SESSION['user'] = $_POST['user'];
return true;
}

function logoutUser()
{
session_start();
if(isset($_COOKIE[session_name()]))
{
$_SESSION = array();
session_destroy();
header("location: login.php");
exit;
}
}
?>


Die Login.php


<?php
session_start();

if(!isset($_SESSION['server_SID']))
{
session_unset();
$_SESSION = array();
session_destroy();
session_start();
session_regenerate_id();
$_SESSION['server_SID'] = true;
}

$_SESSION['logged'] = false;
$msg = '';
$con = '';
$input = array();

include("functions.inc.php");

$con = db_connect();

if(isset($_POST['login']))
{
$input = cleanInput();
$user = $input['user'];
$pass = $input['pass'];
$login = loginUser($user, $pass, $con);
$update = updateUser();
if($login == 1)
{
if ($update)
{

header("location: index.php");
exit();
}
}
else
{
$msg = print("<h3>Die Anmeldung war fehlerhaft!</h3>") . mysql_error();
}
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login Script</title>
</head>

<body>

<form id="loginform" method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
<table>
<tr>
<td><label for="benutzer">Benutzer: </label></td><td><input type="text" name="user" id="user" value="" /></td>
</tr>
<tr>
<td><label for="passwort">Passwort: </label></td><td><input type="password" name="pass" id="pass" value="" /></td>
</tr>
<tr>
<td><input type="submit" name="login" id="login" value="Login" /></td>
</tr>
</table>
</form>
</body>
</html>


und die index.php


<?php
session_start();

include("functions.inc.php");

$con = db_connect();

if (isset($_SESSION['logged']))
{
print("<h3>Willkommen im Memberbereich.</h3>");
}
else
{
print("<h3>Hallo Gast.</h3>");
die;
}

if (isset($_POST['logout']))
{
logoutUser();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login Script</title>
</head>

<body>
<form id="loginform" method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
<table>
<tr>
<td><input type="submit" name="logout" id="logout" value="Ausloggen" /></td>
</tr>
</table>
</form>
</body>
</html>

phpBuddy
27.01.2011, 15:55
Hallo,

wenn Du die Logingeschichte eh nur komplett via Session lösen möchtest und den Zugang nicht in einem eigenen Cookie ablegst, dann verstehe ich nicht, wieso Du überhaupt die Arbeit von PHP übernehmen möchtest, indem Du selbst, manuell die Session löschen willst. Spar dir doch in dem Fall die Funktion logout, mit der Abfrage, sondern leite einfach auf eine einfache Seite weiter auf der die Session gelöscht wird (session_destroy()) und von dort zurück zur Login Seite.

Oder anders ausgedrückt, schmeiss doch einfach mal diese unnötige Abfrage if(isset($_COOKIE[session_name()])) komplett raus. Du brauchst auf die Existenz des Session Cookies nicht zu prüfen, das macht PHP schon für dich. Es sollte vollkommen ausreichen, wenn die Logout Funktion so aussieht:
function logoutUser()
$_SESSION = array();
session_destroy();
header("location: login.php");
exit;
}

DuRa
27.01.2011, 16:11
Alles klar.
Um dann nochmal zu meiner ursprünglichen Frage zurückzukehren, dass ich immer noch eingeloggt bin, wenn ich nach dem Logout wieder auf die index.php zugreife. Gibt es da irgendeinen Weg, das zu bewerkstelligen? Denn auch mit dieser Funktion bin ich immer noch beim gleichen Ergebnis.

phpBuddy
27.01.2011, 16:24
Ich denke Du gehst da viel zu kompliziert ran und verhedderst dich.
Hier mal eine ganz primitive Vorgehensweise, wie ich sie schon zig Mal auf Seiten eingesetzt habe.

Login Seite zum einloggen.
Sonstige Seiten für eingeloggte User haben einen einfachen Textlink:
<a href="logout.php">Logout</a>

In der logout.php steht ausschließlich das:
<?php
session_start();
$_SESSION = array();
session_destroy();
header("location: login.php");
exit;
?>

Und Fertig!

Da ist nix mit manuell ein Session Cookie abfragen. Ebenfalls ist es unnötig das Logout mit einer Form durchzuführen.

DuRa
27.01.2011, 21:04
Okay danke. Nur leider ändert das nichts an dem bisher bestehenden Problem. Das Cookie wird mit einer neuen ID beim Logout neu erstellt und hat den gleichen Inhalt wie nach dem Login.

phpBuddy
27.01.2011, 21:31
Das kann eigentlich nicht sein. Wenn die Session richtig resettet und zerstört wurde, kann PHP von sich aus keine neue Session mit den gleichen Daten anlegen, weil diese schlicht nicht mehr existieren nach dem session_destroy().
Bist Du dir sicher, dass Du nicht irgendwo im Script noch einige Testzeilen o.ä. stehen hast.

Du kannst gerne mal das komplette Script mitsamt der Tabellenstruktur anhängen, dann teste ich es mal auf meinem Server. Ich bin mir ziemlich sicher, dass Du da was gravierendes übersehen hast.

DuRa
27.01.2011, 21:50
Alles klar. Und nebenbei schon mal danke, dass du dir die Zeit nimmst dir das alles anzuschaun. :)

DuRa
28.01.2011, 13:01
Ah, ich hab meinen Fehler gefunden. Ich habe einfach nur abgefragt ob die Sessionvariable "logged" gesetzt ist und nicht ob sie auf true oder false gesetzt ist.

phpBuddy
28.01.2011, 13:45
Hallo DuRa,

schön das Du dein Problem bereits selbst lösen konntest. Ich hatte noch keine Zeit dein Script hier zu testen, was aber jetzt ja nicht mehr nötig ist. :)