Ik heb een tijd terug een authenticatie systeem gemaakt dat per page-refresh de session id refreshed. het probleem is aleen dat als een gebruiker te snel op refresh ramt de browser niet optijd de nieuwe cookie geset krijgt en de session dus verloren gaat.
Dit is de hoofdklasse die de sessies afhandeld.
De adapter klasse is alleen implementatie logic, deze implementeerd een getIdentity method die een array met username en password terug geeft en een validate method die zoals de naam zegt true of false geeft.
Ik heb een packet sniffer tussen mij en de webserver geplaatst om de php session id's op te vangen en de sessionid gaat inderdaad fout als ik te snel refresh.
Heeft iemand hier ook ervaring mee of een workaround?
Dit is de hoofdklasse die de sessies afhandeld.
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
| <?PHP // The session cookie can only be accessed by the http protocol ini_set('session.cookie_httponly',1); // The session id is only retrieved trought the PHPSESSID cookie variable ini_set('session.use_only_cookies',1); class session { var $_adapter; var $_requestToken; var $_sessionToken; var $_isNewSession; var $_callBackQue; var $onValid; var $onRecover; var $onNew; var $onIdentityValid; var $onIdentityInvalid; function session($vars){ $this->_parseVars($vars); $this->_sessionStart(); $this->getSessionToken(); $this->getRequestToken(); if ( !$this->_isNewSession() ) { if ( !$this->validSession() ) $this->_placeInQue($this->onRecover); else $this->_placeInQue($this->onValid); } else $this->_placeInQue($this->onNew); $oldSession = $_SESSION; $oldSessionId = session_id(); session_regenerate_id(); $newSessionId = session_id(); session_id($oldSessionId); session_destroy(); session_id($newSessionId); session_start(); $_SESSION = $oldSession; } function _sessionStart(){ if ( strlen ( session_id() ) === 0 ) { session_start(); } } function getSessionToken() { if ( $this->_isNewSession() ) { $this->_sessionToken = md5 ( $_SERVER['HTTP_USER_AGENT'] ); $_SESSION['AUTH']['TOKEN'] = $this->_sessionToken; } else { $this->_sessionToken = $_SESSION['AUTH']['TOKEN']; } return $this->_sessionToken; } function getRequestToken() { if ( !$this->_requestToken ) { $this->_requestToken = md5 ( $_SERVER['HTTP_USER_AGENT'] ); } return $this->_requestToken; } function _isNewSession() { if ( empty( $this->_isNewSession ) ) { if ( !isset ( $_SESSION['AUTH']['NEW'] ) ) { $this->_isNewSession = true; $_SESSION['AUTH']['NEW'] = false; } else { $this->_isNewSession = false; } } return $this->_isNewSession; } function validSession() { if ( $this->getRequestToken() === $this->getSessionToken() ) return true; else return false; } function _placeInQue($callback) { $this->_callBackQue[] = $callback; } function execCallbackQue() { foreach ( $this->_callBackQue as $callback ) { $this->_callFuncIfExists($callback); } } function _callFuncIfExists($function) { if ( function_exists ( $function ) ) call_user_func( $function ); } function _parseVars($vars) { foreach ( $vars as $key => $value ) { $this->{$key} = $value; } } function forgetMe() { setcookie(session_name(), session_id(), time()-42000, '/'); session_destroy(); } function validate($adapter) { $this->_adapter = $adapter; if ( !$this->_adapter->validate() ) { $this->_placeInQue($this->onIdentityInvalid); } else { $this->_placeInQue($this->onIdentityValid); } } } ?> |
De adapter klasse is alleen implementatie logic, deze implementeerd een getIdentity method die een array met username en password terug geeft en een validate method die zoals de naam zegt true of false geeft.
Ik heb een packet sniffer tussen mij en de webserver geplaatst om de php session id's op te vangen en de sessionid gaat inderdaad fout als ik te snel refresh.
Heeft iemand hier ook ervaring mee of een workaround?