Ten eerste, gebruik sessions en geen cookies,
Cookies zijn eenvoudig aan te passen, en dus niet veilig.
Verder zou je een session kunnen koppelen aan IP, en desnoods browseragent er ook nog bij.
En ook kijken of ze niet via XSS je cookie hebben bemachtigd, inplaats dat die een cookie heeft aangepast.
wat html_entities doet wonderen op berichten, profiel, forum enzovoort.
Verder zou je session_regenerate_id kunnen gebruiken, bijvoorbeeld een bepaalde tijd instellen (10 minuten?) in de session, en als die tijd over is de tijd weer aanpassen en session_regenerate_id gebruiken om een nieuwe session aan te maken (Vergeet niet de oude te verwijderen)
Zo zouden ze met XSS alsnog binnen 10 minuten de cookie gebruiken, en desnoods in combinatie met IP check en browseragent check.
Offtopic: Vind het geen probleem dat je cookies moet toestaan, eigenlijks wel fijn zelfs.
Maar hoop wel dat de browsers het onthouden of je de cookies wilt onthouden of niet voor een bepaalde website.
Edit:
Even een voorbeeld van php.net die werd geplaatst door een gebruiker, is dus niet door mij gemaakt!
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
|
<?php function regenerateSession($reload = false) { // This token is used by forms to prevent cross site forgery attempts if(!isset($_SESSION['nonce']) || $reload) $_SESSION['nonce'] = md5(microtime(true));
if(!isset($_SESSION['IPaddress']) || $reload) $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR'];
if(!isset($_SESSION['userAgent']) || $reload) $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT'];
//$_SESSION['user_id'] = $this->user->getId();
// Set current session to expire in 1 minute $_SESSION['OBSOLETE'] = true; $_SESSION['EXPIRES'] = time() + 60;
// Create new session without destroying the old one session_regenerate_id(false);
// Grab current session ID and close both sessions to allow other scripts to use them $newSession = session_id(); session_write_close();
// Set session ID to the new one, and start it back up again session_id($newSession); session_start();
// Don't want this one to expire unset($_SESSION['OBSOLETE']); unset($_SESSION['EXPIRES']); }
function checkSession() { try{ if($_SESSION['OBSOLETE'] && ($_SESSION['EXPIRES'] < time())) throw new Exception('Attempt to use expired session.');
if(!is_numeric($_SESSION['user_id'])) throw new Exception('No session started.');
if($_SESSION['IPaddress'] != $_SERVER['REMOTE_ADDR']) throw new Exception('IP Address mixmatch (possible session hijacking attempt).');
if($_SESSION['userAgent'] != $_SERVER['HTTP_USER_AGENT']) throw new Exception('Useragent mixmatch (possible session hijacking attempt).');
if(!$this->loadUser($_SESSION['user_id'])) throw new Exception('Attempted to log in user that does not exist with ID: ' . $_SESSION['user_id']);
if(!$_SESSION['OBSOLETE'] && mt_rand(1, 100) == 1) { $this->regenerateSession(); }
return true;
}catch(Exception $e){ return false; } }
?>
|
|
|