Hallo
Aktuell prüfe ich bei jeder Anfrage an den internen Bereich ob die URL einen Token hat und ob er in der Session enthalten ist.
token = 48 Zeichen
Eine Zuordnung von User und Session/Token erfolgt nicht.
Bisher habe ich nur sehr selten ajax verwendet und damit kaum Probleme. Als ich jetzt mein System etwas überarbeitet habe und den Content-Bereich hauptsächlich über Ajax aufbaue, habe ich natürlich ein Problem, wenn die Session abgelaufen ist.
Folgende Probleme habe ich jetzt
- Alle Links (auch Menü) enthalten einen &token=48 Zeichen
- Änderungen die nicht vor Ablauf der Session gespeichert wurden, sind verloren
- Eine abgelaufene Session führt dazu, dass die Login-Seite im Content-Bereich geladen wird
Mein Ansatz wäre jetzt:
- Session mit 32 Zeichen (Cookie)
- KeepAlive-Cookie mit 48 Zeichen (z.B. 6h)
- Datenbankeintrag mit UserId, TimeOfLive, Token und Hash aus Token und KeepAlive
Wird eine Anfrage mit einem Token und KeepAlive gemacht, wobei KeepAlive nicht zum Hash passt, wird der Eintrag aus der DB gelöscht und man muss sich neu anmelden. Somit hat man genau einen Versuch sich Zutritt zum System zu verschaffen und muss dabei 96 richtige Zeichen übergeben.
Hab das mal schnell verpackt.
Aktuell prüfe ich bei jeder Anfrage an den internen Bereich ob die URL einen Token hat und ob er in der Session enthalten ist.
PHP-Code:
if(!isset($_GET['token']) || !isset($_SESSION['token']) || ($_GET['token'] != $_SESSION['token']))
//angefragten controller ausführen
else
//login controller ausführen
Eine Zuordnung von User und Session/Token erfolgt nicht.
Bisher habe ich nur sehr selten ajax verwendet und damit kaum Probleme. Als ich jetzt mein System etwas überarbeitet habe und den Content-Bereich hauptsächlich über Ajax aufbaue, habe ich natürlich ein Problem, wenn die Session abgelaufen ist.
Folgende Probleme habe ich jetzt
- Alle Links (auch Menü) enthalten einen &token=48 Zeichen
- Änderungen die nicht vor Ablauf der Session gespeichert wurden, sind verloren
- Eine abgelaufene Session führt dazu, dass die Login-Seite im Content-Bereich geladen wird
Mein Ansatz wäre jetzt:
- Session mit 32 Zeichen (Cookie)
- KeepAlive-Cookie mit 48 Zeichen (z.B. 6h)
- Datenbankeintrag mit UserId, TimeOfLive, Token und Hash aus Token und KeepAlive
Wird eine Anfrage mit einem Token und KeepAlive gemacht, wobei KeepAlive nicht zum Hash passt, wird der Eintrag aus der DB gelöscht und man muss sich neu anmelden. Somit hat man genau einen Versuch sich Zutritt zum System zu verschaffen und muss dabei 96 richtige Zeichen übergeben.
Hab das mal schnell verpackt.
PHP-Code:
if(isset($_GET['token']) && isset($_SESSION['token']) && ($_GET['token'] == $_SESSION['token'])){
$user = $_SESSION['userId'];
//nach 10 Minuten wird keepAlive verlängert um nicht bei jedem Request einen neuen Cookie zu setzen
if($_SESSION['keepAlive']+600 < time()){
$keepAlive = token(48);
setcookie('keepAlive',$keepAlive,strtotime("+6 hours"),ini_get('session.cookie_path'), ini_get('session.cookie_domain'),true,true);
$db->setKeepAlive($user,$keepAlive,$_SESSION['token']);
}
}else if(isset($_GET['token']) && (isset($_GET['keepAlive']) && $_GET['keepAlive'] == true) && isset($_COOKIE['keepAlive'])){
//In Bereichen wo Eingaben / Änderungen gespeichert werden sollen, wird über die URL keepAlive bestätigt
$result = $db->getUserByKeepAlive($_GET['token'], $_COOKIE['keepAlive']);
if($result){
$_SESSION['userId'] = $result['user_id'];
if($_SESSION['keepAlive']+600 < time()){
$keepAlive = token(48);
setcookie('keepAlive',$keepAlive,strtotime("+6 hours"),ini_get('session.cookie_path'), ini_get('session.cookie_domain'),true,true);
$db->setKeepAlive($result['user_id'],$keepAlive,$_SESSION['token']);
}
}else{
$db->deleteKeepAlive($_GET['token']);
//Weiterleitung zu login
}
}else if(isset($_COOKIE['keepAlive']) && isset($_GET['token'])){
$db->deleteKeepAlive($_GET['token']);
//Weiterleitung zu login
}else{
//Weiterleitung zu login,
}
