Een tijd geleden (ruim een jaar) heb ik topic ge-opend met de vraag of een bepaalde methode van user authenticatie veilig was. Inmiddels (
) ben ik wat verder en heb ik ook wat online staan wat getest zou mogen worden.
De core van de validatie werkt als volgt:
Op elke pagina, welke alleen toegankelijk is na inlog, wordt dit stukje code gedraait:
De User-class die hier wordt aangeroepen bevat onder andere de volgende methods:
Op Experts-Exchange ben ik ook al een topic begonnen hierover met de vraag hoe veilig bovenstaande code is.
Online, op mijn site, staat een login-formpje, waar - wat mij betreft - mensen mogen proberen de authenticatie te passeren, breken of buigen. Zie hier:
http://webtweakers.com/login/
De pagina op dat adres is puur en alleen een test-environment. Als iemand in staat is de authenticatie te omzeilen zien ze niet meer dan een berichtje en ik krijg een mail.
Er zijn een aantal dingen waarmee de beveiliging uit te breiden is, zoals te lezen is in een mooie FAQ over website beveiliging opgezet door drm en ACM (zie het hoofdstukje over Intruder detection).
De technieken die daar genoemd staan, lijken me een waardevolle toevoeging. Alleen staan of vallen ze met het achterhalen van het IP adres van de bezoeker:
Bovenstaande functie werkt braaf, maar in 't geval dat een bezoeker achter een soort van AOL-proxy zit, dan varieert het IP adres bij elke aanroep en zullen de genoemde methodes falen.
Mijn vragen:
1. is iemand in staat om mijn beveiliging te omzeilen, en zo ja: hoe?
2. is er een methode om nog extra beveiliging toe te voegen met voorwaarde dat deze wel algemeen goed werkt (dus niet voor alleen statische adressen ofzo)...?
3. ziet iemand nog een lek of iets waar ik niet aan gedacht heb?
Wat mij betreft mag je dus proberen m'n login lek te prikken, maar gebruik aub geen drastische methodes zoals (D)DoS attacks en dergelijke! Het gaat me puur om de veiligheid van m'n code: over de server heb ik geen invloed.
Ik zal in iedergeval een link naar dit topic op die pagina plaatsen, zodat ik bewezen heb dat het om mijn eigen site gaat en niet om het systeem van iemand anders.
Lees anders ook het topic op Experts-Exchange.
PS: van de P&W crew heb ik toestemming om dit topic te plaatsen, waarvoor mijn dank.
De core van de validatie werkt als volgt:
Op elke pagina, welke alleen toegankelijk is na inlog, wordt dit stukje code gedraait:
PHP:
1
2
3
4
5
6
7
8
9
10
11
| // Instantiate user class if (!isset($_SESSION['user']) || !$_SESSION['user']) $_SESSION['user'] = new User(TBL_USERS); // If this user does not validate, throw login form if (!$_SESSION['user']->isValid()) { if (!$_SESSION['user']->validate()) { $_SESSION['user']->login(); exit; } } |
De User-class die hier wordt aangeroepen bevat onder andere de volgende methods:
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
| // Public: validates a user function validate() { global $db, $log; // Return false if userpass is not posted from the html-form if (!isset($_POST['userpass']) || !$_POST['userpass']) return false; // Get user and pass from userpass list($userid, $formPass) = explode(':', $_POST['userpass']); // Get password of requested user from DB if (!$db->exec("select password from ".$this->usersTable. " where strcmp(userid, '".addslashes($userid)."')=0")) return false; // DB-query should return one record if ($db->numRows() != 1) return false; // Retrieve password from resultset and encrypt like formPass $dbPass = md5($db->fetchField('password').$this->rndval); // dbPass and formPass should be the same now if ($dbPass != $formPass) return false; // All tests passed... $this->valid = true; $this->userId = addslashes($userid); $this->loadDetails(); $this->updateLastLogin(); $db->free(); return true; } // Public: prepares and shows login form function login() { // Prepare random number and save in this object $this->rndval = rand(1111, 9999); // Prepare login template and show // ... } |
Op Experts-Exchange ben ik ook al een topic begonnen hierover met de vraag hoe veilig bovenstaande code is.
Online, op mijn site, staat een login-formpje, waar - wat mij betreft - mensen mogen proberen de authenticatie te passeren, breken of buigen. Zie hier:
http://webtweakers.com/login/
De pagina op dat adres is puur en alleen een test-environment. Als iemand in staat is de authenticatie te omzeilen zien ze niet meer dan een berichtje en ik krijg een mail.
Er zijn een aantal dingen waarmee de beveiliging uit te breiden is, zoals te lezen is in een mooie FAQ over website beveiliging opgezet door drm en ACM (zie het hoofdstukje over Intruder detection).
De technieken die daar genoemd staan, lijken me een waardevolle toevoeging. Alleen staan of vallen ze met het achterhalen van het IP adres van de bezoeker:
PHP:
1
2
3
4
5
6
7
| function getIp() { if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP'); elseif (getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR'); else return getenv('REMOTE_ADDR'); } |
Bovenstaande functie werkt braaf, maar in 't geval dat een bezoeker achter een soort van AOL-proxy zit, dan varieert het IP adres bij elke aanroep en zullen de genoemde methodes falen.
Mijn vragen:
1. is iemand in staat om mijn beveiliging te omzeilen, en zo ja: hoe?
2. is er een methode om nog extra beveiliging toe te voegen met voorwaarde dat deze wel algemeen goed werkt (dus niet voor alleen statische adressen ofzo)...?
3. ziet iemand nog een lek of iets waar ik niet aan gedacht heb?
Wat mij betreft mag je dus proberen m'n login lek te prikken, maar gebruik aub geen drastische methodes zoals (D)DoS attacks en dergelijke! Het gaat me puur om de veiligheid van m'n code: over de server heb ik geen invloed.
Ik zal in iedergeval een link naar dit topic op die pagina plaatsen, zodat ik bewezen heb dat het om mijn eigen site gaat en niet om het systeem van iemand anders.
Lees anders ook het topic op Experts-Exchange.
PS: van de P&W crew heb ik toestemming om dit topic te plaatsen, waarvoor mijn dank.
[ Voor 6% gewijzigd door Explore op 09-08-2003 16:03 ]
[ specs ] [ Tweaker gallery ]