• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

PHP-Session eingeloggt bleiben

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Hallo!
Auf meiner Seite kann man sich registrieren und auch einloggen.
Allerdings war es bis jetzt immer so, dass man nach ca. 3-4 Stunden Inaktivität ausgeloggt wurde (Session wurde automatisch beendet).
Jetzt habe ich noch eine Funktion "Eingeloggt bleiben" eingebaut.
Erst hatte ich es mit
Code:
if($_POST["stayloggedin"]) {
	$lifetime = 2678400;
}
else {
	$lifetime = 2000;
}
ini_set("session.cookie_lifetime", $lifetime);
ini_set("session.gc_maxlifetime", 2678400);
versucht, wobei man trotzdem nicht eingeloggt blieb.
Ich hatte noch die Idee den Nutzernamen und eine md5-verschlüsselte Version des Passworts in einem Cookie zu speichern und dann beim Aufrufen, wenn man nicht eingeloggt ist automatisch einzuloggen. Jetzt weiß ich allerdings nicht ob das so wirklich "sicher" ist..
Hat jemand eine andere Idee das zu realisieren? Wie machen das die anderen Seiten (beispielsweise Apfeltalk - hier kann man ja bei Eingeloggt bleiben einen Haken machen und dann ist man für mehrere Wochen eingeloggt)..

Vielen Dank im Voraus:)
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Okay, ich habs jetzt selber gemacht und es funktioniert auch schon wunderbar! Vielen Dank erstmal!
Nur dass die Session über alle Subdomains reicht funktioniert noch nicht. (Also mit dem .domain.de habe ich gemacht!)
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Okay. Von der PHP-Datei zum Einloggen:
Code:
ini_set("session.use_cookies", "On");
if($_POST["stayloggedin"]) {
	$lifetime = 2678400;
}
else {
	$lifetime = 2000;
}
ini_set("session.use_trans_sid", "1");
session_set_cookie_params($lifetime, "/", ".drp-seiten.de");
session_start();
 

Bananenbieger

Golden Noble
Registriert
14.08.05
Beiträge
25.515
Und Du bist sicher, dass die Sessions aller Subdomains auch die gleichen sind?

Und gibt es einen Grund für "session.use_trans_sid" => 1 ?
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Auch das eingeloggt bleiben funktioniert nicht :(
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Woran könnte das denn liegen?
Also der Code müsste fehlerfrei sein.
 

dominik.html

Idared
Registriert
27.04.11
Beiträge
24
Cookie?

Erstelle dir einfach einen Cookie, der einen Monat hält. Wenn der Nutzer auf die Checkbox "stay" klickt, wird ein einmonatiger Cookie angelegt, der ihn wieder einloggt.

Code:
if(isset($_POST['stay']) && $_POST['stay'] == 'yes') {
setcookie('Stay', md5('P1kachoo') . $session['username'], time() + 30 * 86400); // Geheimes Schlüsselwort wählen!
}
In der Login.php

Am Anfang jeder Datei dann:
Code:
if(isset($_COOKIE['stay']) && substr($_COOKIE['stay']) == md5('P1kachoo')) { //geheimes Kennwort, Lösung mit preg_Match ggf. besser
session_start();
// Variablen setzen
// ...
}

So gesehen ist dein Vorschlag schon richtig gewesen, DRP. Mein Skript musst du vielleicht noch ein bisschen anpassen und den zweiten Teil erweitern. Ich hoffe, ich konnte dir helfen.

dominik.html
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Danke erstmal für deine Antwort!
Soweit ich das jetzt überblicken konnte entsteht aber doch eine Sicherheitslüche, da man ja einfach den im Cookie gespeicherten Nutzernamen ändern kann um somit in ein anderes Profil zu gelangen.
Somit müsste der Benutzername auch verschlüsselt werden.
Oder allerdings das Passwort wird ebenso als md5-verschlüsseltes Cookie gespeichert (zusätzlich zu dem Nutzernamen). (Also so wie ich es anfangs geschrieben habe) - das müsste doch eigentlich super sicher sein, oder? (Es sei denn man kann md5 entschlüsseln UND hat Zugriff auf die Cookies).

Wäre das so sicher??
 

dominik.html

Idared
Registriert
27.04.11
Beiträge
24
Sicher wäre es auf jeden Fall, denn MD5 zu knacken hat bisher nur wenigen gelingen müssen, schließlich sind kaum Fälle bekannt. Angeblich sollen die Amis schon mal MD5 gehackt haben, aber der Aufwand ist viel zu groß, als dass es sich lohnen würde.

Ich habe meinen Code mal angepasst.

Code:
if(isset($_POST['stay']) && $_POST['stay'] == 'yes') {
setcookie('Stay', md5('P1kachoo') . $session['username'] . md5($_POST['pass']), time() + 30 * 86400); // Geheimes Schlüsselwort wählen!
}

// Part 2:

if(isset($_COOKIE['stay']) && substr($_COOKIE['stay'], 0, 32) == md5('P1kachoo')) {
if(md5(mymysqlvaluegetfunc('pass', substr($_COOKIE['stay'], 32, 32)) == substr($_COOKIE['stay'], 64, 32)) { // Passwort aus Cookie mit echtem Passwort vergleichen; ggf. durch echte Funktion ersetzen.
session_start();
$_SESSION['username'] = substr($_COOKIE['stay'], 32, 32);
}
}

Ich habe beides in eine Cookie gepackt.
Allerdings ist dieser Code auf die Schnelle entstanden. Fehler sind vorenthalten.

dominik.html
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Okay, das ist so ähnlich wie ich es vorher hatte. Dann werde ich das noch etwas anpassen..

Danke für die Hilfe:)
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Okay, das erste Problem wäre gelöst :)
Trotzdem reichen die Sessions immer noch nicht über alle Subdomains.
Und das trotz dem
Code:
session_set_cookie_params($lifetime, "/", ".drp-seiten.de");

Hat schon jemand dafür eine Lösung??
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Okay, habs jetzt (endlich) hinbekommen :)
Undzwar mit dem letzten Zeile:
Code:
if($_POST["stayloggedin"]) {
	$lifetime = 2678400;
}
else {
	$lifetime = 2000;
}
ini_set("session.use_trans_sid", "1");
session_set_cookie_params($lifetime, "/", ".drp-seiten.de");
session_start();
setcookie("PHPSESSID", session_id(), time()+$lifetime, "/", ".drp-seiten.de");

EDIT: Ha! Und das verhindert jetzt sogar das automatische ausloggen!
Dann habe ich direkt zwei Fliegen mit einer Klappe erwischt :)
 

Bananenbieger

Golden Noble
Registriert
14.08.05
Beiträge
25.515
Soweit ich das jetzt überblicken konnte entsteht aber doch eine Sicherheitslüche, da man ja einfach den im Cookie gespeicherten Nutzernamen ändern kann um somit in ein anderes Profil zu gelangen.
Am Besten ist es eh, wenn man weder Nutzernamen noch Passwort im Cookie speichert, sondern mit von Nutzerkonten unabhängigen, wechselnden Session-IDs arbeitet (siehe auch http://de2.php.net/session_regenerate_id )
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
Das stimmt natürlich.
Aber jetzt funktioniert es ja.
Das mit dem Session Wechseln ist einfach nur zur Sicherheit, dass die Session-ID nicht über einen Monat gleich bleibt?
 

Bananenbieger

Golden Noble
Registriert
14.08.05
Beiträge
25.515
Eigentlich wechselt man die Session ID häufiger. So kann nicht einfach eine Session gekapert werden.
 

drp

Jerseymac
Registriert
12.04.11
Beiträge
458
D. H. Ich sollte so eine Funktion einbauen, dass die Session ID wie von dir beschrieben dann ungefähr einmal am Tag gewechselt wird?
 

Bananenbieger

Golden Noble
Registriert
14.08.05
Beiträge
25.515
Ich würde die Session nach jeder Speicheroperation (also z.B. Mailversand, Kommentar speichern, Passwortänderung etc.) und nach jedem Login neu generieren.

So bieten man Angreifern wenig Angriffspunkte und ein Kapern der Session wird relativ schnell vom eigentlichen Benutzer bemerkt.