Bescheidene Frage zu Session und Sessioncookie

SmileMan

Grünschnabel
Hallo zusammen,

ich hab da mal eine bescheidene Frage zu Session und Sessioncookie:

Und zwar hab ich folgendes: Ich habe eine Gruss- und Wunschbox für ein Radio geschrieben, mit extra Admin- und Moderatoren-Bereich. Die eingeschränkten Bereiche habe ich mit Sessions abgesichert.

Das Problem, was aber ab und zu mal auftritt ist, dass die Session in völlig unregelmäßigen Abständen plötzlich gelöscht ist und sich der User wieder neu einloggen muss. Dies passiert aber auch nicht jedesmal.
Es kann auch nicht daran liegen, dass es aufgrund von nichtaktivität passiert. Beispielsweise, wenn ein Moderator während seiner Sendung eingeloggt ist, wird die Seite mit den Grüßen und Wünschen alle 30 Sekunden neu geladen, somit ist ja danna uch immer eine aktivität da.

Ich hatte erst gedacht, dass es vielleicht daran liegt, dass die Session aufem Server und nicht als Cookie aufem Client gespeichert wird. Ich habe aber jetzt in der php.ini gesehen, dass session.use_cookies und session.use_only_cookies beide schon auf 1 stehen, was mir sagt, dass grundsätzlich die session als cookie aufem Clientrechner abgelegt wird.
Allerdings kann ich kein entsprechendes Cookie finden. Ich habe auch extra mal den Cookie Ordner geleert und mich dann eingeloggt. Aber es wurde trotzdem kein Cookie angelegt.

Jetzt bleibt mir aber noch die Frage: Werden die Sessioncookies nicht im normalen Cookie Ordner gespeichert?
Oder wird der Sessioncookie nicht über session_start() angelegt?


Ich hoffe, mir kann bei dieser Angelegenheit jemand helfen.


Gruß
Stefan
 
Vielleicht hilft es, wenn du manuell ein Cookie anlegst. Das erreichst du über setcookie().

Allerdings sollte eine Session nicht einfach so verloren gehen. Überlässt du das Session-Management dem Server oder hast du da eigene Routinen am laufen? Lädst du die Seite nach 30 Sekunden über Meta-Refresh oder über den PHP-Header? Wie prüfst du ob der User eingeloggt ist? Nur über die Session ID?

Gruss Igäl
 
Wie von Igäl schon gesagt brauchen wir mehr Infos wie du prüfst ob der User eingeloggt ist? über Cookie? GET?

cheers
 
Ich habe das ganze folgendermassen aufgebaut: Der User gibt in einem kleinen Formular seine Logindaten ein. Diese werden per Post an ein PHP-Skript übergeben, das überprüft, ob der benutzer in der Datenbank existiert und die erforderlichen Rechte besitzt.

Diese Datei startet auch zum ersten mal die Session. Wenn mit dem Login alles passte, wird entsprechend den Rechten entweder für den Mod- oder dem Adminbereich eine Variable in der Session registriert und der User entsprechend in den jeweiligen Bereich üner meta refresh weitergeleitet.

Die beiden Bereiche haben jeweils eine Datei, die die gesamte Steuerung übernimmt. Das heisst: In dieser einen Datei wird der Header und der Footer fest includet ud alle unterseiten dann dynamisch per Get mit ?seite=unterseite.
Die Links sind damit natürlich so aufgebaut: seite.php?seite=unterseite.

Wenn der User also jetzt ein Link anklickt, wird "Seite.php" also neu geladen und die angegebene Unterseite includet. Bei diesem "neuladen" wird jedes mal überprüft, ob die entsprechende Variable, die beim Login in der Se3ssion registriert wurde, existiert. Wenn nicht, wird die Seite angehalten udn ein fehler ausgegeben.


Ich bin leider nur ein Anfänger, was PHP angeht, sodass ich jetzt nicht mit 100%iger Sicherheit sagen kann, ob ich auf diese Weise das Sessionmanagement selbst übernehme oder ob der Server das übernimmt. Aber von meiner Logik her, würde ich fast sagen, dass der Server das übernimmt.


Ich hoffe, ich hab Euch damit alle Infos gegeben, die Ihr braucht um mir evtl. zu helfen :-)


Gruß
Stefan
 
Um ein paar Unklarheiten aus den Weg zu räumen: Die Daten einer Sitzung werden immer serverseitig gespeichert. Das ist ja gerade der Vorteil von Sitzungen.
Die Sitzungs-ID dient dabei als Identifikator des Clients, um ihn eine Sitzung zuzuordnen. Und diese Sitzungs-ID ist das einzige, was schlussendlich an den Client weitergegeben. Dies kann je nach Situation per Cookie, GET-Argument oder verstecktem Formularelement geschehen.
 
Bin jetzt einfach davon ausgegangen das du kein Cookie setzt bzw dort keine feste Zeit definierst. Generell ist es am einfachsten wenn du das betreffende Script postest.
 
Zuletzt bearbeitet:
Hier mal die Admin.php, damit Ihr sehen könnt, wie ich das mit der überprüfung, ob eingeloggt oder nicht, mache:

PHP:
<?
session_start();
if (!isset($_SESSION["admin"]))
{
	echo '<b><center>Wenn Du wissen willst, ob eine Avocado reif ist, steche mit einem Zahnstocher in den  Stiel. Geht der Zahnstocher leicht rein und raus, ist sie reif.<p>Du kannst mit dieser Information nichts anfangen Dann liegt das daran, dass ich Dir den Zugriff auf diesen Bereich verweigere</center></b>';
}
else
{
require_once("config.php");
?>
<html>
<head>
<title>Gru&szlig;box - Administration</title>
<link rel="stylesheet" href="css.css" type="text/css">
</head>
<body>
<table width="100%" border="0" cellspacing="5" cellpadding="5">
  <tr>
    <td colspan="2"><div align="center"><img src="<? echo $radiobanner; ?>" border="0"></div></td>
  </tr>
  <tr>
  <td colspan="2"></td>
  </tr>
  <tr>
    <td width="20%" valign="top"><? include("admin/navi.php"); ?></td>
    <td width="80%">
    <?
	if ($_GET["seite"] == "")
	{
		include("admin/start.php");
	}
	else
	{
		include("admin/". $_GET["seite"] .".php");
	}
	?>
    </td>
  </tr>
  <tr>
    <td colspan="2">&nbsp;
    </td>
  </tr>
  <tr>
    <td colspan="2" align="center">&copy; 2007 <a href="http://www.smileservice.de" target="_blank">Smile Service Dienstleistungen</a>
    </td>
  </tr>
</table>
</body>
</noframes>
</frameset>
</html> 
<?
}
?>
 
Wo wird diese Varible gesetzt -> $_SESSION["admin"]?

Poste bitte mal die dazu gehörene Login-Routine...
 
Zuletzt bearbeitet:
Hier ist die Loginroutine:

PHP:
<?
session_start();
?>
<html><head><title>Disco-Beatz - Loginbearbeitung</title>
<link rel="stylesheet" href="css.css" type="text/css">
</head>
<body>
<?php
require_once("./config.php");
$loginname = $_POST["loginname"];
$passwort = $_POST["passwort"];
$md5pass = md5($passwort);

$db = mysql_connect($dbhost, $dbuser, $dbpass) or die("Verbindungsfehler");
$sql_befehl = "SELECT * FROM grusbox_user WHERE user LIKE '$loginname'";
$result = mysql_db_query($dbname, $sql_befehl);
mysql_close($db);

while($row = mysql_fetch_object($result))
{
	$dbname = $row->user;
	$dbpass = $row->pass;
	$dbrechte = $row->rechte;
}

if ($loginname == $dbname)
{
	if ($md5pass != $dbpass)
	{
		echo '<center><font size="26px" weight="bold">Zugriff verweigert!<p><font size="16px">Grund: Eingegebenes Passwort ist falsch.</font></center>';
		echo '<meta http-equiv="refresh" content="3; URL=index.html">';
	}
	else
	{
		if ($dbrechte == "0")
		{
			$_SESSION["admin"] = "1";
			echo '<center><b>Login erfolgreich, Weiterleitung erfolgt...';
			echo '<meta http-equiv="refresh" content="3; URL=admin.php?seite=start">';
		}
		if ($dbrechte == "2")
		{
			$_SESSION["mod"] = "1";
			echo "<center><b>Login erfolgreich, Weiterleitung erfolgt...</b>";
			echo '<meta http-equiv="refresh" content="3; URL=mod.php?seite=start&onairname='. $dbname .'">';
		}
	}
}
else
{
	echo '<center><font size="26px" weight="bold">Zugriff verweigert!<p><font size="16px">Grund: Eingegebener Benutzername ist falsch.</font></center>';
	echo '<meta http-equiv="refresh" content="5; URL=index.html">';
}
?>
 
Zurück