automatische sessie verlenging
Ik vraag met af of het mogelijk is een inlogsessie automatisch te verlengen met behulp van een script. (weet niet of PHP hier toereikend voor is)
Het gaat om het volgende: op de pagina werk.nl als je bent ingelogd, moet je binnen 15 minuten handmatig je sessie verlengen. Anders word je uitgelogd en vervallen je gegevens.
Je krijgt weliswaar een popupje als je sessie nog maar 2 minuten of iets duurt maar als je dan net een kopje koffie aan het drinken bent en niet achter de computer zit heb je pech en wordt je uitgelogd.
Als ik met de muis op "Verleng uw sessie" sta zie ik dat bestaande url met een # teken erachter wordt aangeroepen. Dat is dus voldoende om je sessie te verlengen.
Is het mogelijk om dit in een script op de achtergrond te laten werken en daarin om de zoveel tijd een request op die server te doen om de sessie te verlengen?
Gewijzigd op 24/10/2013 14:05:06 door Jack Maessen
En dan stel je een tijd in van (bijvoorbeeld) 13 minuten.
Zodra je wat doet begint die teller weer opnieuw met lopen.
Ik dacht dat de browser Maxton ook zoiets heeft.
In veel browser kan je tegenwoordig zelf je eigen stijblad (CSS) over een website gooien (in Opera kon dat wel). Dan zal je zoiets vast ook wel voor Javascript hebben (om te herladen). En anders is er wel een addon (Chrome/FF) voor.
In theorie hoef je alleen maar een <meta refresh> toe te voegen...
Toevoeging op 24/10/2013 14:16:56:
@eddy: dat is geen sessie verlengen maar gewoon je page herladen :P
Toevoeging op 24/10/2013 14:17:21:
Ow je kan trouwens ook een auto clicker laten klikken op de refresh button :)
Er zou dus iets moeten zijn dat eerst de url checkt, en vervolgenns de refresh doet op bestaande url...
Edit: maar dan zit je nog met het inputprobleem; stel je bent een sollicitatiebrief aan het schrijven online op de site en er vind een refresh plaats; weg alle gegevens...
Gewijzigd op 24/10/2013 14:21:19 door Jack Maessen
Jack maessen op 24/10/2013 14:17:54:
ja die meta refresh had ik ook al aan gedacht maar het vervelende is natuurlijk dat de url iedere keer wijzigt.
Er zou dus iets moeten zijn dat eerst de url checkt, en vervolgenns de refresh doet op bestaande url...
Edit: maar dan zit je nog met het inputprobleem; stel je bent een sollicitatiebrief aan het schrijven online op de site en er vind een refresh plaats; weg alle gegevens...
Er zou dus iets moeten zijn dat eerst de url checkt, en vervolgenns de refresh doet op bestaande url...
Edit: maar dan zit je nog met het inputprobleem; stel je bent een sollicitatiebrief aan het schrijven online op de site en er vind een refresh plaats; weg alle gegevens...
Dat je input data verloren zal gaan, zul je niet kunnen voorkomen. Je kunt immers niks onderwater refreshen. Waarom werk.nl sowieso maar 15 minuten heeft is inderdaad raar. Lang niet iedereen kan een sollicitatiebrief typen in 15 minuten.
Ik weet niet welke browser je gebruikt, maar voor Firefox en Chrome zijn er refresh addons/plugins die je in kunt stellen op 13 minuten. Meestal krijg je dan een knop bij in je browser waarmee je hem simpel aan en uit kan zetten. Je gaat niet onder een sollicitatie brief typen koffie drinken lijkt me. En anders zal deze toch na 15 minuten verloren gaan begrijp ik. Op het moment dat jij dan zin hebt in koffie schakel je de refresh plugin/addon in en klaar.
De server houdt voor alle gebruikers wat variabelen in het geheugen van de server vast en om te weten wie wie is wordt er een cookie geplaatst met een sleutel. Is het cookie verlopen dan is het jammer heb je geen sleutel meer.
Zoiets kun je zelf ook maken. Je kunt 'handmatig' een cookie plaatsen met een sleutel er in. Je kunt dan zelf bepalen hoe lang zo een cookie geldig is. Dan zou ik de gegevens niet in meer in $_SESSION opslaan maar in de database.
Frank Nietbelangrijk op 24/10/2013 14:42:18:
Wat doet een sessie?
De server houdt voor alle gebruikers wat variabelen in het geheugen van de server vast en om te weten wie wie is wordt er een cookie geplaatst met een sleutel. Is het cookie verlopen dan is het jammer heb je geen sleutel meer.
Zoiets kun je zelf ook maken. Je kunt 'handmatig' een cookie plaatsen met een sleutel er in. Je kunt dan zelf bepalen hoe lang zo een cookie geldig is. Dan zou ik de gegevens niet in meer in $_SESSION opslaan maar in de database.
De server houdt voor alle gebruikers wat variabelen in het geheugen van de server vast en om te weten wie wie is wordt er een cookie geplaatst met een sleutel. Is het cookie verlopen dan is het jammer heb je geen sleutel meer.
Zoiets kun je zelf ook maken. Je kunt 'handmatig' een cookie plaatsen met een sleutel er in. Je kunt dan zelf bepalen hoe lang zo een cookie geldig is. Dan zou ik de gegevens niet in meer in $_SESSION opslaan maar in de database.
Hoe wil dit doen voor een externe website? Ik mag hopen dat werk.nl niet zo makkelijk te hijacken is.
En wat bedoel jij precies met een externe website Michael?
als ik jou begrijp Frank dan zou ik op zoek moeten gaan naar het cookie waarin de sessietijd staat vermeld. dit cookie openbreken en de sessiontime verlengen. Dat is wat je zegt toch?
Als het met een sessiecookie werkt, kan dat. Of je stript het automatisch verversen (en dus dat jou uitlogt) eruit.
Onderstaand voorbeeld is in staat om een sessie na te bootsen.
de sessievariabelen zijn hier altijd van het type string en hebben maximaal 255 karakters.
de sessiegegevens en variabelen worden in de database opgeslagen en uitgelezen.
oude sessiegegevens worden nog niet uit de database verwijderd.
Dat is nog niet optimaal en zou zeker anders kunnen. Maar het gaat er even om het idee te verduidelijken.
Misschien is het een idee om met elkaar hier iets moois van te maken?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
// Hoe lang duurt het voor de sessie verloopt in seconden
define('SESSION_DURATION', 3600);
// de naam van het cookie
define('SESSION_IDENTIFIER', 'OWN_SESSION_ID');
// secret token dat gebruikt wordt om een hash te genereren
define('SECRET', 'pHpHuLp');
// database instellingen
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_DBASE', 'test');
// lege database class, kan later uitgebreid worden
class Database extends mysqli
{
}
// onze eigen sessie class
class OwnSession
{
private $db;
private $sess_id;
private $sess_key; // de hash
private $vars; // array van session variabelen
function __construct($db)
{
$this->db = $db;
$this->vars = array();
$this->sess_id = 0;
// kijk of er een cookie is
if(isset($_COOKIE[SESSION_IDENTIFIER]))
{
// kijk of er een geldige sessie gevonden kan worden in de database
$result = $this->db->query("SELECT id FROM sessions WHERE sess_key='".$_COOKIE[SESSION_IDENTIFIER]."' && TIME_TO_SEC(TIMEDIFF(NOW(), started)) < " . SESSION_DURATION);
if($row = $result->fetch_assoc())
{
// laad de sessie-data uit de database
$this->sess_id = $row['id'];
$this->sess_key = $_COOKIE[SESSION_IDENTIFIER];
$this->db->query("UPDATE sessions SET started=NOW() WHERE id='" . $this->sess_id . "'");
$this->loadSessionVars();
}
}
// als er geen sessie gevonden is in de database maak dan een nieuwe sessie aan
if(!$this->sess_id)
{
$this->sess_key = sha1(SECRET . time() . rand()); // willekeurige hash genereren
$this->db->query("INSERT INTO sessions VALUES ( '', '" . $this->sess_key . "', NOW() )"); // sla de hash en de huidige timestamp op in de database
$this->sess_id = $this->db->insert_id;
}
// plaats een (nieuwe) cookie
setcookie(SESSION_IDENTIFIER, $this->sess_key, time() + SESSION_DURATION);
}
function __destruct()
{
$this->db->query("DELETE FROM sess_vars WHERE session_id='" . $this->sess_id . "'");
foreach($this->vars as $key => $val)
{
$this->db->query("INSERT INTO sess_vars VALUES ( '','" . $this->sess_id . "','" . $key . "','" . $val . "' )");
}
}
function setVar($name, $value)
{
$this->vars[$name] = $value;
}
function getVar($name)
{
if(isset($this->vars[$name]))
return $this->vars[$name];
return null;
}
function unsetVar($name)
{
unset($this->vars[$name]);
}
public function loadSessionVars()
{
$result = $this->db->query("SELECT name, value FROM sess_vars WHERE session_id='".$this->sess_id."'");
while($row = $result->fetch_assoc())
{
$this->setVar($row['name'], $row['value']);
}
}
public function install()
{
$query =
'CREATE TABLE IF NOT EXISTS `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sess_key` varchar(255) NOT NULL,
`started` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;';
$this->db->query($query);
$query =
'CREATE TABLE IF NOT EXISTS `sess_vars` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`session_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `session_id` (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;';
$this->db->query($query);
}
}
$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_DBASE);
$sn = new OwnSession($db);
// create database tables
$sn->install();
echo 'vorige tijd: ' . $sn->getVar('time');
$sn->setVar('time', date('H:i:s'));
?>
// Hoe lang duurt het voor de sessie verloopt in seconden
define('SESSION_DURATION', 3600);
// de naam van het cookie
define('SESSION_IDENTIFIER', 'OWN_SESSION_ID');
// secret token dat gebruikt wordt om een hash te genereren
define('SECRET', 'pHpHuLp');
// database instellingen
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_DBASE', 'test');
// lege database class, kan later uitgebreid worden
class Database extends mysqli
{
}
// onze eigen sessie class
class OwnSession
{
private $db;
private $sess_id;
private $sess_key; // de hash
private $vars; // array van session variabelen
function __construct($db)
{
$this->db = $db;
$this->vars = array();
$this->sess_id = 0;
// kijk of er een cookie is
if(isset($_COOKIE[SESSION_IDENTIFIER]))
{
// kijk of er een geldige sessie gevonden kan worden in de database
$result = $this->db->query("SELECT id FROM sessions WHERE sess_key='".$_COOKIE[SESSION_IDENTIFIER]."' && TIME_TO_SEC(TIMEDIFF(NOW(), started)) < " . SESSION_DURATION);
if($row = $result->fetch_assoc())
{
// laad de sessie-data uit de database
$this->sess_id = $row['id'];
$this->sess_key = $_COOKIE[SESSION_IDENTIFIER];
$this->db->query("UPDATE sessions SET started=NOW() WHERE id='" . $this->sess_id . "'");
$this->loadSessionVars();
}
}
// als er geen sessie gevonden is in de database maak dan een nieuwe sessie aan
if(!$this->sess_id)
{
$this->sess_key = sha1(SECRET . time() . rand()); // willekeurige hash genereren
$this->db->query("INSERT INTO sessions VALUES ( '', '" . $this->sess_key . "', NOW() )"); // sla de hash en de huidige timestamp op in de database
$this->sess_id = $this->db->insert_id;
}
// plaats een (nieuwe) cookie
setcookie(SESSION_IDENTIFIER, $this->sess_key, time() + SESSION_DURATION);
}
function __destruct()
{
$this->db->query("DELETE FROM sess_vars WHERE session_id='" . $this->sess_id . "'");
foreach($this->vars as $key => $val)
{
$this->db->query("INSERT INTO sess_vars VALUES ( '','" . $this->sess_id . "','" . $key . "','" . $val . "' )");
}
}
function setVar($name, $value)
{
$this->vars[$name] = $value;
}
function getVar($name)
{
if(isset($this->vars[$name]))
return $this->vars[$name];
return null;
}
function unsetVar($name)
{
unset($this->vars[$name]);
}
public function loadSessionVars()
{
$result = $this->db->query("SELECT name, value FROM sess_vars WHERE session_id='".$this->sess_id."'");
while($row = $result->fetch_assoc())
{
$this->setVar($row['name'], $row['value']);
}
}
public function install()
{
$query =
'CREATE TABLE IF NOT EXISTS `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sess_key` varchar(255) NOT NULL,
`started` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;';
$this->db->query($query);
$query =
'CREATE TABLE IF NOT EXISTS `sess_vars` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`session_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `session_id` (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;';
$this->db->query($query);
}
}
$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_DBASE);
$sn = new OwnSession($db);
// create database tables
$sn->install();
echo 'vorige tijd: ' . $sn->getVar('time');
$sn->setVar('time', date('H:i:s'));
?>
Gewijzigd op 25/10/2013 00:39:04 door Frank Nietbelangrijk