mitchell
Goto Top

Login und Logout

Session will nich beendet werden.

Hallo Leute,

ich habe hier ein Problem mit einem Logout-Skript, bei dem die Session einfach nicht beendet werden will. Wobei man beenden wohl nicht sagen kann, eher wird sie immer wieder direkt aufgerufen. Hier erstmal Code mit Erklärung:


Das ist der relevante Teil beim Login, vorher erfolgt natürlich noch Vergleich von Benutzerangaben usw. Der Login funktioniert eigentlich einwandfrei.
{

			$_SESSION['angemeldet'] = 1;  

			setcookie ("PHPSESSID",$row['user'],time()+7 * 86400,"/");  

			header ('Location: ../mein_index.php');  

}

Hier der Check, ob der Benutzer eingeloggt ist, funktioniert auch:
function logged_in() {

	if ($_SESSION['angemeldet'] == 1) {  

		return(true);

	} else {

		return(false);

	}



}

Und nun der Logout, der irgende nicht so richtig will:
function logout() {

	setcookie("PHPSESSID", '', time()-42000, '/');  

	session_unset($_SESSION['angemeldet']);  

	return session_destroy(); // gibt bei Erfolg true zurŸck

}

Nun passiert also folgendes: Der User kommt auf die Seite und loggt sich ein, prima. Cookie wird gesetzt, Session "angemeldet" ist auch da. Nun will ich mich ausloggen und die Seite mit eben nur dieser Funktion logout wird aufgerufen. Das Cookie ist weg, die Session aber nicht. Wenn ich nun per URL-Manipulation auf einen geschützten Bereich zugreife, der per logged_in abgefragt wird, komme ich dort rein. Per "echo" sehe ich auch, dass sowohl das Cookie, als auch die Session wieder da sind. Testweise habe ich Cookies mal komplett deaktiviert, weil ich dachte, dass vielleicht irgendwas immer geladen wird (obwohl ja gelöscht). Dem ist aber nicht so, denn auch ohne Cookies komme ich immer wieder in meine geschützten Bereiche. Browser schließen, also Sessionablauf, bringt nichts. Die ist einfach immer da.

Was ich beim Logout schon probiert habe:

session_name('angemeldet');
session_unset;
session_destroy;
$_SESSION = array();
session_destroy();
---
session_unset($_SESSION['angemeldet]);
session_destroy();


Es hat alles Nichts geholfen, weiß jemand Rat?

Mfg

Mitchell

Content-Key: 119406

Url: https://administrator.de/contentid/119406

Printed on: April 18, 2024 at 07:04 o'clock

Member: Dani
Dani Jun 30, 2009 at 21:04:10 (UTC)
Goto Top
Hi Mitchell,
ich habe die Logoutfunktion gar nicht so geschrieben. Bei mir ist es einfach eine Art Modul:
<?php
@session_start();
include_once ("inc/header.php");  

session_destroy();
session_unset($_SESSION);
$_SESSION=array();

echo "<meta http-equiv='refresh' content='2; URL=index.php'>";  
?>
So sollte es auch bei dir gehen...kommt auch vllt. ein bisschen auf die PHP Version an.


Grüße,
Dani
Member: Mitchell
Mitchell Jul 01, 2009 at 08:50:18 (UTC)
Goto Top
Hi Dani,

außer dem Header habe ich das schon ausprobiert, siehe oben. Aber ich habe auch mal dein Skript laufen lassen, leider nichts face-sad. Ich werde hier noch wahsinnig, in jedem verdammten Manual bzw. Buch steht, dass eine Session mit:

session_start();
$_SESSION = array();
session destroy();

bzw. bei benannten Sessions mit

session_name('name');  
session_start();
session_unset();
sessiion_destroy();

beendet wird, warum dann bei mir nicht?

Mfg
Mitchell
Member: Arano
Arano Jul 01, 2009 at 10:06:55 (UTC)
Goto Top
Moin moin

Der Login funktioniert eigentlich einwandfrei.
Hm... scheint mir besser zu funktionieren als er sollte !

Was machst du eigendlich mit dem Cookie ?
Wirst du vielleicht über den immer wieder eingeloggt ?

Warum überschreibst du die PHP-Session-Id in dem Cookie mit einem Benutzernemen ?
Wie kommts, das trotz überschriebener (falscher) Session-Id die Session auf dem Server wiederhergestellt wrden kann ?

Funktioniert dein Login vieleich überhaubt nicht ?


~Arano
Member: masterG
masterG Jul 01, 2009 at 11:15:30 (UTC)
Goto Top
Normales Logout script bei mir:

<?php
session_start();
setcookie ("PHPSESSID", "", time() - 3600); //Damit verfällt der cookie  
session_destroy();
header("Location: index.php");  
?>
wozu unset($_SESSION) ?. session_destroy(); macht das schon.
Member: Mitchell
Mitchell Jul 01, 2009 at 16:48:26 (UTC)
Goto Top
@masterG

Das session_unset(); war auch nur ein Test, weil es vorher nicht klappte.

@Arano
Hm... scheint mir besser zu funktionieren als er sollte !
wie meinst du das? Deine letzte Frage muss ich nämlich nach mehreren Versuch doch verneinen, ich hab mich wohl von den "echo" Meldungen in die irre führen lassen. Stimmt, der Login funktioniert nicht, aber warum? Ich habe mein altes Skript nochmal eingespielt, weils mit dem neuen nicht klappte, müsste aber im Prinzip das selbe sein:

relevanter Teil vom Login ist gleich, aber das Cookie hab ich rausgenommen.

Der Check:

function logged_in()
{
	if ($_SESSION['angemeldet'] != true)  
	{
	echo "Du bist NICHT angemeldet";  
	}
}

und der Logout:

{
	session_name('angemeldet');  
	session_unset();  // bzw. $_SESSION = array();
	session_destroy();
}

Was machst du eigendlich mit dem Cookie ?
das wird ab PHP 4xx automatisch gesetzt face-smile
Wirst du vielleicht über den immer wieder eingeloggt ?
Den Verdacht hatte ich auch, daher erstmal ganz weg.
Warum überschreibst du die PHP-Session-Id in dem Cookie mit einem Benutzernemen ?
weil ich eine benannte Session will.
Wie kommts, das trotz überschriebener (falscher) Session-Id die Session auf dem Server wiederhergestellt wrden kann ?
gerade das will ich ja herausfinden.

Da aber der Login schon nicht funktioniert, sind die Fragen oben erstmal Nebensache. Ich tüftel mich hier zu Tode, das kann doch nich so schwer sein. Ich habe ja schonmal einen Login geschrieben, sowas vergisst man doch nicht face-confused


Mfg

Mitchell
Member: Arano
Arano Jul 02, 2009 at 00:20:27 (UTC)
Goto Top
Hm hm...

Du scheinst da grundsätzlich was durcheinander zu bringen ...glaube ich :D

Auf der einen Seite möchtest du eine benannte Session (mit dem Benutzernamen) "login()" und
auf der anderen Seite willst du immer NUR die Session "angemeldet" "logout()" beenden.
So würde die benannte Session (mit dem Benutzernamen) immer bestehen bleiben was einen erneuten login zu folge hätte trotz vermeindlichem logout.

Dazu kommt noch das du so die Session nicht umbenennst sondern lediglich ungültig machst den:
Für eine benannte Session müsstest du, sofern ich das Manual eben richtig überflogen habe, "session_name()" vor "sesssion_start()" aufrufen:
<?php
  session_name('wasserrohrbruch');  
  session_start();
  
  echo 'Diese Session heisst: "'.session_name().'"<br>';  
  // Ausabe: Diese Session heisst: "wasserrohrbruch" 
?>
Das Gegenstück zum logout:
<?php
  session_start(); // Der Sessionname (id) wird aus dem Cookie gezogen)
  session_unset();
  session_destroy();
?>

Bei dir lief es glaube ich so ab:
    • Session wird gestartet und heisst:" 16df4g5s61d6g516df16sfhj6j"
    • Session-Id im Cookie wird mit dem Benutzernamen überschrieben: "Arano"
    • Session soll gelöscht werden: "angemeldet"
Daraus resultiert: die Session " 16df4g5s61d6g516df16sfhj6j" bleíbt unverändert und __bestehen__ erneuter login durch selbige.

Sollte ich mich irren, tschuldigung face-smile

Und vielleciht doch mal etwas mehr vom Script preisgeben, z.B: den login vorgang von dem ausser dir och keiner weiss wie der aussieht - ob wohl diese eine potentielle Fehlerquelle sein kann ;)


So, gehe erst mal pennen, hatten nen Sprenkleranlagen__wasserrohrbruch__ in Lager...
~Arano
Member: Mitchell
Mitchell Jul 02, 2009 at 19:11:26 (UTC)
Goto Top
Hi Arano,

das session_name(); wird beim Login doch gesetzt oder täusche ich mich da. Jedenfalls hab ich es auch schon damit probiert, habs nur zur Übersicht nochmal rausgenommen, es stand jedenfalls schon in JEDEM Skript:
seesion_name('angemeldet);  
session_start();

Und ich weiß immernoch nicht, wie du auf eine Session mit Username kommst. Ich dachte, du meinst "angemeldet", aber scheinbar hatten wir da aneinander vorbeigeredet, sorry für den Irrtum face-smile. Es gibt jedenfalls nach dem vermeindlichen Login, oder was immer momentan ausgeführt wird, eine Session angemeldet, das lasse ich mir per ECHO-Befehl auf jeder Seite ausgeben. Nur was ich nicht begreife - und damit hat das Ganz wohl zu tun (denke ich mal) - ist, dass die globale Variable $_SESSION['angemeldet'] leer bleibt, obwohl ich doch beim Login per
$_SESSION['angemeldet'] = 1;  
was reinschreibe, oder hab ich mich da völlig vertan? Ich dachte, es liegt vielleicht an der 1 bzw. dem True-Wert. Aber selbst, wenn ich irgendwas reinschreibe ("hier bin ich"), bleibt die globale Variable leer.

z.B: den login vorgang von dem ausser dir och keiner weiss wie der aussieht...
steht doch oben, aber hier dann mal die komplette Funktion mit Abfragen:

function login()
{
// SQL CONNECT

include ("sql_user.inc.php");  
$sql = mysql_query("SELECT user, passwort, register FROM benutzer WHERE user = '$_POST[benutzername]' AND passwort = MD5('$_POST[pass]')");  
$row = mysql_fetch_array($sql);

	if (isset($_POST['send']))  
	if ($row['register'] == '0')  
	{
	echo "Dein Account wurde noch nicht freigeschaltet, bitte klicke nochmal auf den Aktivierungslink in der E-Mail oder kontaktiere den Webmaster";  
	}
	elseif (!$row)
	{
	echo "Du konntest nicht angemeldet werden, bitte &uuml;berpr&uuml;fe deine Eingabe";  
	}
	elseif (strtolower($_POST['benutzername']) == strtolower($row['user']) && md5($_POST['pass']) == $row['passwort'])  
	{
	session_name('angemeldet');  
	$_SESSION['angemeldet'] = 'its me';  
	header ('Location: ../mein_index.php');  
	}
	else
	{
	echo "Es ist ein Fehler aufgetreten, bitte kontaktiere den Webmaster";  
	}
}

und hier noch der PHP-Teil in der "mein_index" (wird direkt am Anfang geschrieben, danach kommt nur noch HTML), in die NICHT eingeloggt wird:

<?php
	include ("./data/functions.inc.php");  
	logged_in();
echo $_SESSION['angemeldet']." ist die globale Session"."<br>";  
echo session_name()." ist der Sessionname";  
?>

Habe übrigens sowohl in "mein_index", als auch in der "login()-Funktion" schon session_name('angemeldet'); gefolgt von session_start(); getestet...ohne Erfolg.

Mfg
Mitchell
Mitglied: 79754
79754 Jul 13, 2009 at 07:14:32 (UTC)
Goto Top
Moinsen
Das ist hier alles gerade sehr verwirrend, will dennoch mal versuchen, etwas bei zu steuern. Deshalb hier mal eine meiner Kreationen.
Ich denke, es liegt daran, wie die Session aufgebaut wird.

Immer beachten!!
session_start() erzeugt eine Session oder nimmt die aktuelle wieder auf. Wenn eine benannte Session verwendet wird, muss session_name() aufgerufen werden, bevor session_start() aufgerufen wird.

Per Formular sende ich Login Informationen an folgendes Scripts. Dort baue ich dann die Session auf.
<?php
session_start ();
include_once ('inc_conf/cl_db_mysql.inc.php');  
include_once ('inc_conf/cl_db.inc.php');  
include_once ('inc_conf/common.inc.php');  

$db = new db;
$array_ergebnis = $db->execute("SELECT Id, Nickname, Nachname, Vorname, Akt FROM benutzerdaten WHERE Nickname = '".$_REQUEST["name"]."' AND Kennwort = '".md5 ($_REQUEST["pwd"])."'");  
if($db->num_rows()>0)
  {
    foreach($array_ergebnis as $zeile)
      {
        $_SESSION["user_id"] = $zeile["Id"];   
        $_SESSION["user_nickname"] = $zeile["Nickname"];   
        $_SESSION["user_nachname"] = $zeile["Nachname"];   
        $_SESSION["user_vorname"] = $zeile["Vorname"];  
        $_SESSION["akt"] = $zeile["Akt"];  
        $_SESSION["admin"] = $zeile["Admin"];  
        if ($_POST["pagelogin"] == 'gaestebuch')   
          { 
            header ("Location: ?seite=gaestebuch");  
          }
        if ($_POST["pagelogin"] == '[cd]picture_vw')   
          { 
            header ("Location: ?seite=[cd]picture_vw");  
          }
      }
  }
else 
  { 
    error('Nickname oder Kennwort nicht korrekt!');  
  }
unset($db);
?> 

Das folgende Script prüft, ob ein Benutzer angemeldet ist.

<?php 
  session_start (); 
  if (!isset ($_SESSION["user_id"]))   
    {
      include 'inc_conf/formular.inc.php';  
    }
  else
    {
      if ($_SESSION['akt'] == '0')  
        {
          echo "<p>Ihr Account wird noch überprüft und ist noch nicht aktiviert. Bitte haben Sie Geduld.</p>";  
          session_start ();
          session_unset (); 
          session_destroy ();
          echo "<a href='?seite=start' target='_self'>Hier gehts weiter!</a>";  
        }
      else
        {
           bla bla....
?> 

Und hier mein Logout

<?php 
session_start (); 
session_unset (); 
session_destroy (); 
echo "<h2>Logout</h2><p>Sie haben Sich erfolgreich abgemeldet.</p>";  
if ($_REQUEST["pagelogout"] == 'gaestebuch')   
  { 
    echo "<a href='?seite=gaestebuch' target='_self'>Hier gehts weiter!</a>";  
  }
if ($_REQUEST["pagelogout"] == '[cd]picture_vw')   
  { 
    echo "<a href='?seite=start' target='_self'>Hier gehts weiter!</a>";  
  }
?> 
Member: Mitchell
Mitchell Jul 15, 2009 at 08:55:01 (UTC)
Goto Top
Hi SpankyHam,

ich danke dir für dein Skript. Aber leider sehe ich den großen Unterschied nicht. Also natürlich sehe ich den Unterschied zu meinem Skript, aber vom Sessionablauf her müsste es doch das gleiche sein. Vorallem ist dein Logout im Prinzip wie meiner aufgebaut, nur bei mir klappts nicht. Auch werden bei dir wohl die Daten in die globale Varible geschrieben, ich sehe einfach den Fehler nicht.

Mfg

Mitchell

PS: session_name() vor session_start ist bekannt, siehe oben face-smile
Mitglied: 79754
79754 Jul 15, 2009 at 09:48:27 (UTC)
Goto Top
Versuch doch mal, auf session_name() zu verzichten und schau nach, ob du überall session_start () verwendet hast.
Member: Mitchell
Mitchell Jul 15, 2009 at 11:31:35 (UTC)
Goto Top
habe ich schon, ohne benannte Session funktioniert es auch (halbwegs). Ich habe mir mal die ID auf jeder Seite ausgeben lassen und siehe da, er übergibt sie nicht. Daher hab ich an jeden Link ein ".SID." gehangen, natürlich gehts dann. Aber das kann doch nicht die Lösung sein? 1. müsste ich dann auf jeder Seite die SID übergeben und abfragen und 2. kann ich nicht mit dem üblichen arbeiten. Sprich einfach die globalen Sessions abfragen, da diese ja (es sei denn, ich übergebe immer manuell die SID) leer bleiben.

Mfg

Mitchell
Member: Mitchell
Mitchell Jul 30, 2009 at 10:15:01 (UTC)
Goto Top
Hi Leute,

ich kann es zwar nicht mehr genau nachvollziehen, da ich einfach das Projekt nochmal komplett neu angefangen habe, aber ich bin mir ziemlich sicher, dass der Fehler vor dem Bildschirm war. Ich habe einfach bei der ganzen Testerei mit Cookie, Sessionnamen und beim Löschen der selbigen was durcheinandergeschmissen. Cookie wurde mal gelöscht, obwohl es nie da war (weil ich zu Testzwecken diese im Browser unterbunden habe), Session umbenannt, aber im Logout vergessen, dies umzuschreiben...

Ich danke Allen, die sich meiner angenommen haben face-wink

Mfg

Mitchell