session
-
Hallo Leute!
Ich habe ne theoretische Frage zu Sessions:
Ich bekomme vom User entweder per GET oder per Cookie die Session ID, die ich ihm zugewiesen habe.
Soweit so gut.
Mit dieser Session ID kann ich auf Daten zugreifen, die ich auf dem Server (entweder in einer Datenbank oder als Textfiles) gespeichert habe.ABER: wann loesche ich diese daten wieder?
Der User kann die Session ja quasi ewig offen lassen...sollte ich vielleicht alle daten die aelter als (sagen wir mal) 30 minuten sind loeschen? Wenn ja, wann schaue ich nach ob es veraltete daten gibt? Bei jedem Session-Create?
Oder macht man es gaenzlich anders?
Und kennt vielleicht auch jemand eine schoene methode zum erstellen einer unique Session ID?
-
für die session_id
in php generiert er sie ja jetzt selber.. mit den neuen session_id_funktionen
aber früher habe ich folgendes genommen:
/* Berechne neue "relativ" eindeutige UIN */ srand((double)microtime()*1000000); $UIN = md5(uniqid(rand()));
hier eine beschreibung (vielleicht kannste du es irgendwie umsetzen)
http://www.php.net/manual/en/function.uniqid.phpgrundlage... klar.. die zeit
-
Mhm... Zeit war klar als basis...
Mit md5 ists n guter Trick, nur die Funktion uniqueID macht mir noch sorgen... Wie implementiert man sie? Bei 2 Anfragen in der selben mikrosekunde stehe ich dann n bisschen bloed da Naja, ich hab schon ne vorlaeufige loesung, aber wenn jemanden was besseres einfaellt (zB wie man uniqueID implementieren koennte) dann nur her damit.
Zur meiner anderen Frage:
Wie lange soll ich die Session Daten auf dem Server lassen?
Ich habe hier aus den User Posts herausgelesen, dass PHP bei jedem Session_start() nachsieht, ob es veraltete daten gibt...
Gibt es ein besseres verhalten? denn das ergibt ein Problem:if someone starts a session A and no one starts a session for an hour, that person can reconnect to session A and all of their previous session values will be available
OK, wenn es PHP so macht, kann ich es auch so machen... aber vielleicht hat jemand eine bessere Idee?
-
Original erstellt von Shade Of Mine:
Bei 2 Anfragen in der selben mikrosekunde stehe ich dann n bisschen bloed dasollte trotzdem kein problem sein
srand((double)microtime()*1000000); $uin = md5(uniqid(rand())); $ip = getenv ("REMOTE_ADDR"); $browser = addslashes(substr($HTTP_USER_AGENT,-50));
$uin, $ip und browser-kürzel einfach in eine db-tabelle packen..
vielleicht noch eine variable die bestimmt ab wann die daten ungültig sind..10 min. gültigkeit ab jetzt wäre
$expire = time() + 60*10;
kannst dann einfach die session-tabelle nach ungültigkeiten durchsuchen und diese direkt löschen.. so mach ich das bisher, ich lasse mich jedoch gerne noch von etwas besserem belehren, da ich noch nicht so lange bei der web-programmierung dabei bin *zueliseguck*
edit: das mit dem durchsuchen und löschen meinte ich so (wurde vielleicht nicht so deutlich..)
mysql_query("DELETE FROM tabelle WHERE expire<".time())
das -50 bei browser heist übrigens lediglich das die kennung ab dem 50sten zeichen abgeschnitten wird..
[ Dieser Beitrag wurde am 28.10.2002 um 18:09 Uhr von blacksheep editiert. ]
-
kleiner Tip:
Wenn du PHP verwendest, nimm doch die integrierten sessionsMir bringt das aber nicht viel... Ich mach das ganze momentan ueber md5 und mikrosekunden, wobei ich die letzten 15 unique IDs speichere und schaue ob die gerade erstellt schon vorgekommen ist
nur, falls es nicht ganz rueber gekomme ist, ich verwende kein PHP, sondern schreibe alles selber (C++)
-
wird wohl zeit das ich mir mal die session-funktionen anschaue..
-
ich denke die Methode sollte sicher genug sein denn es ist sehr unwahrscheinlich dass sich die MD5 Strings in so einer kurzen Zeit gleichen. Wenn du sicherstellst das die Dinger nicht doppelt erzeugt werden, sprich die Microtime nicht doppelt vorkommt dann ist es doch gut. Was anderes ist es mit dem Verfallsdatum, ich find es nicht gut wenn Sessions verfallen, denn dafür sind sie ja da, sprich um eine konsistente Verbindung aufrecht zu erhalten. Aber sowas kann man ja einstellen, ich weiss ja nicht wie du das ansich löst, aber wie ich gesehen habe willst du mit Cookies arbeiten ? (dein anderer Thread) Naja dann ist es ja so das man den Cookie so einstellen kann das er zerfällt wenn der Browser zu gemacht wird, dann ist die Session eh weg und in deiner DB für die Speicherung der Sessions machste eben eine maximale Obergrenze, sprich du lässt vielleicht 1000 Sessions zu, weiss ja nicht wofür es ist, und alle Sessions die halt älter sind fliegen automatisch raus, naja und die Zeit musste halt updaten, damit nicht auch aktive Langzeituser rausgekegelt werden obwohl sie eigentlich noch on sind.
-
Sessions ewig offen zu halten ist ein Sicherheitsrisiko, kommt natürlich auf die Anwendung an. Bei onlinebanking, webshops, webmailclients usw. würde ich auf jeden Fall ein Sessiontimeout festlegen. Kann man das bei php nicht irgendwo konfigurieren bzw. gibts da keine methode wie setSessionTimeout(30) oder so ähnlich? Z.b. bei tomcat geht das.
@JoelH:
Du meinst ein temporäres Cookie. Du hast nur teilweise recht. Beim Schließen des Browsers ist das Cookie weg, aber die Session bleibt erhalten.
Das alte Problem, wie kriegt der Server mit, das der Client tot ist? =>
Gar nicht. Darum gibts ja auch immer die Logoff-Buttons, damit genau das erreicht wird, nämlich die Session und die dazugehörigen Variablen am Server löschen.[ Dieser Beitrag wurde am 29.10.2002 um 10:08 Uhr von ms editiert. ]