Session einen Tag lang registriert lassen

Pinky

Erfahrenes Mitglied
Hallo Tutorials,

ich habe ein Login-Script geschrieben. Dort wird der Username sowie Passwort abgefragt und in einer Session gespeichert.

Darauf habe eine Linkmenu gemacht, dass nur dann angezeigt wird, wenn die beiden Session s registriert sind, d.h. ich prüfe folgendermassen

PHP:
if (session_is_registered('username'))
echo "<a href='link.php'>"...

Soweit so guet. Nun zum Problem resp. zur Fragenstellung!

Wenn ich nun alle Browserfenster schliesse, werden auch die Sessions gelöscht. Ist ja auch klar. Wie mache ich das nun am besten, dass die Session 24h zur verfügung stehen, damit man sich nicht immer neu Anmelden muss, wenn mann alle Browserfenster zu gemacht hat?

Als Hilfe: Ich möchte es so, wie ihre es mit eurem Loginsystem habt. So ungefähr. Einfach, dass man angemeldet belibt, wenn man alle Browserfenster schliesst!

Vielen Dank
Euer Pinky
 
Zuletzt bearbeitet:
Hallo Pinky,
Prinzipiell gibt es nur eine Möglichkeit, um für ein Programm, dessen "Oberprogramm" geschlossen wurde, Daten bereitzuhalten. Nämlich diese extern zu speichern.

Da es ansonsten extreme Sicherheitslücken geben würde, ist dies nur mit Cookies möglich.
Die akzeptiert zwar nicht jeder Browser, aber es ist die einzige Möglichkeit um die Daten persistent zu speicheren. Dafür gibt es wiederun zwei Vorgehensweisen.

Methode A
Du kannst die Session im Cookie direkt speichern und die Session-Dauer hochschrauben (=> Einführende PHP-Handbuch-Seite zu Sessions). Dies ist sogar recht komfortabel, da wenn die Session nicht gespeichert werden kann, PHP dir die Arbeit abnimmt und alle LInks mit der Session-ID versieht und man diese somit per GET übergeben kann.

Methode B
Willst du dies allerdings unabhängig von der Session machen, kannst du auch direkt das Passwort des Users sowie einen eindeutige Identifikation für diesen(z.B. Name oder Benutzernummer; wichtig ist nur, dass diese Identiifaktion einmalig ist, um m ögliche Konflikte vorzubeugen ) in einen Cookie schreiben. Allerdings solltest du aus sicherheitstechnischen Gründen niemals das Passwort direkt schreiben. Du solltest viel mehr einen Hashwert (=> [phpf]md5[/phpf], [phpf]sha1[/phpf]) des Passwortes im Cookie speichern. Dann kannst du durch die von PHP mitgebrachten Cookie-Funkionen ([phpf]setcookie[/phpf]), das Passwort sowie die Identifikation auslesen und den User somit automatisch anmelden.
Auch die Cookie-Lebensdauer kannst du einstellen. Am besten ist, wenn du irgendeine utopische Lebenszeit eingestellt, dann wird der Benutzer solange automatishc angemeldet, bis er den (das?) Cookie löscht.

Fazit
Die letztere Methode ist aus sicherheitstechnischen Gründen wohl vorzuziehen, damit machst du dich unabhängig von der Session und kannst vor allem darauf verzichte, die Session so ewig lange anzubieten. Dies könnte nämlich zu Sicherheitsproblemen führen.

Ps:
Als Hilfe: Ich möchte es so, wie ihre es mit eurem Loginsystem habt. So ungefähr. Einfach, dass man angemeldet belibt, wenn man alle Browserfenster schliesst!
Hier wird auch mit Cookies gearbeitet :)
 
Zuletzt bearbeitet:
Hallo Kristoph, danke für die schnell Antwort. Ich habe nun Cookies erstellt. Ich kann sie auch auslesen, d.h. echo $_COOKIE['user']; funktioniert. Ist ja auch nicht schwer.

Deine Aussage verstehe ich nicht ganz:

KristophS hat gesagt.:
(z.B. Name oder Benutzernummer; wichtig ist nur, dass diese Identiifaktion einmalig ist, um mögliche Konflikte vorzubeugen )

Auf was muss ich hier aufpassen? Und wie mache ich das?

Ich interpretiere die Aussage folgendermassen:
Ich muss aufpassen, dass ich den Cookies nicht die selben Namen gebe, wenn sich ein anderer User anmeldet. Aber wie kann ich den Cookies automatisch Namen geben

KristophS hat gesagt.:
Hallo Pinky,
Du solltest viel mehr einen Hashwert (=> [phpf]md5[/phpf], [phpf]sha1[/phpf]) des Passwortes im Cookie speichern.

Und wie geht den das? Aus der PHP-Erklärung wurde ich nicht schlau. Kannst ein kleines Beispiel nenne? Was passiert dann mit dem Passwort?


Danke
Euer Pinky

PS: Wo werden die Cookies eigentlich gespeichert? Auf dem Rechner des Gastes oder auf dem Server der Homepage?
 
Zuletzt bearbeitet:
Hallo,

ich habe den Bericht durchgelesen und bin auf folgendes gesotssen:

In dieses Feld kommt nun ein beliebiger, md5()-verschlüsselter Wert, aber eben nicht das Passwort des Users.

Wie seiht nun ein solcher "beliebiger" Wert aus? Muss ich den selber einfügen? Wenn ja, wie?

Danke
Euer Pinky
 
Im Beispielcode steht die Lösung.
Du kannst irgendetwas nehmen, z.b. [phpf]time[/phpf], username.userid oder so.
Das ganze mit md5 verschlüssel und in den Cookie und die Datenbank/Passwortdatei speichern.
 
Hallo,

ok, habs gemacht und der cookiewert wird in der Datenbank geändert! Nun begreiffe ich aber eins nicht:

Was prüftst du genau bei der Manipulation?

PHP:
// Auf Manipulation ueberpruefen
$id_pruefen = htmlentities($_COOKIE['user_id']);
$string_pruefen = htmlentities($_COOKIE['cookiewert']);
$query = @mysql_query('SELECT id FROM user WHERE cookiewert="'.mysql_escape_string($string_pruefen).'";');
$row = mysql_fetch_array($query);
 
Mit [phpf]htmlentities[/phpf] überprüfe ich auf ein manuelles Editieren des Cookies mit "bösen" Code.
Und mit der Abfrage prüfe ich, ob die User-Id zum Prüfstring gehört. Wenn z.B. die Nummer 11 mauell in 12 geändert wird, passt der String nicht zueinander und der Fehler wird abgefangen.

War es das, was du wissen wolltest?
 
Keine Passwörter in Cookies.....
Jetzt mal ehrlich: Hast du dich schon einmal hingesetzt um den Eingangswert einer beliebigen MD5-Prüfsumme zu rekonstruieren? Allein die Wahrscheinlichkeit von 1:16³² würde mich davon abhalten.
 
Hallo @ all,

habe noch ein weiteres Problem.

Ich habe ein Loginscript und Logindateien in der DB. Wenn mann sich nun anmeldet, d.h. auf den Button "Login" klickt, dann passiert folgendes:

PHP:
$un = $_POST['username']; // Unsername wird von Loginform geholt
$pw = $_POST['password']; // Passwort wird von Loginform geholt
$sql = "SELECT * FROM `login` WHERE `user` = '$un'"; // Hohle nur die Datensätze, die zu der Person passen, die sich anmelden möchte
$res = mysql_query($sql); // Sende SQL-Abfrage an Server
$tmp = mysql_fetch_assoc($res); // Hohle mit z.B. $tmp['user'] die Datensätze raus

Gut, soweit so gut.

PHP:
if ($un == $tmp['user'] && $pw == $tmp['pw']) // Pfrüfe ob PW und Username zusammenpassen und mit DB übereinstimmen
{ 
$user_id = $tmp['id']; // Wähle die $id des Anmeldenden Users
$jetzt = time(); // Nehme die jetztige Zeit
$der_neue_cookie_wert = md5($jetzt.$user_id); // Setze md5-Wert
setcookie ('user_id',$user_id, time()+60*60*24); // Setze Cookie mit der ID des Users
setcookie ('cookiewert',$der_neue_cookie_wert, time()+60*60*24); // Setze Cookie mit md5-Wert
mysql_query('UPDATE login SET cookie="'.$der_neue_cookie_wert.'" WHERE id='.$user_id.';'); // Ersetze den vorhin gebildeten md5-Wert mit dem neuen in DB
}

Ok, das ist mir auch noch klar

PHP:
$id_pruefen = htmlentities($_COOKIE['user_id']); // Prüfen ob daran rumgefummelt wurde
$string_pruefen = htmlentities($_COOKIE['cookiewert']); // Prüfen ob daran rumgefummelt wurde
$query = @mysql_query('SELECT `id` FROM login WHERE cookie="'.mysql_escape_string($string_pruefen).'";'); // Hohlst den Datensatz, der den selben md5-Wert hat wie oben gebildet
$row = mysql_fetch_array($query); // Wählst eine Array aus

Auch noch verständlich

PHP:
if($row[0] == $id_pruefen) { Login erfolgreich } // Prüfen ob Array[0], also ID der ID des Cookies übereinstimmt
else { Zugriff verweigert } // Ansonsten kein Zugriff

Somit ist mir das meiste klar. Wenn ich das script nun aber richtig interpretiere, scheint es mir, als ob das Script immer einen neuen md5-Wert macht, egal, ob der Login fehlschlägt oder nicht. Ebenfals werden immer die zwei Cookies erstellt.

Das heisst, ich kann nicht mit "if(isset($_COOKIE['cookiewert']))" prüfen, ob Cookie gesetzt wurde und dann automatisch weiterleiten. Die Cookies werden ja immer erstellt.

Wie prüfe ich denn nun, ob der User sich bereits angemeldet hat um ihn automatisch weiterzuleiten?

Vielen Dank
Euer Pinky
 
Zurück