beveiligings class veilig genoeg?
ik heb een beveiligings class gebouwd die ik universeel wil gaan gebruiken binnen mijn projecten. mijn vraag aan jullie kunnen jullie hem is bekijken en mij wijzen op fouten/lekken in de beveiliging en wellicht tips geven.
aub geen commentaar geven op het mogelijk onjuist gebruik van OOP maar dit is mijn manier van OOP gebruiken en ik vind hem zo fijn.
het script
class.auth.php
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
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
<?php
//class.auth.php
//last modified 19/07/2009
//version 1.0
class authorization {
public $minlvl = null;
public $error = null;
private $db = null;
function __construct($minlvl = '0')
{
$this->minlvl = $minlvl;
$this->db = new database();
$this->login_check();
}
//login_check, checks if user has acces to the current page
protected function login_check()
{
if (($_SERVER['REQUEST_URI'] == "/login/") or ($this->minlvl == "0")){
return false;
}
if ($_SESSION['adminlvl'] < $this->minlvl){
$this->logout();
}
if($_SESSION['fingerprint'] == hash("sha512",$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_ENCODING'].$_SERVER['DOCUMENT_ROOT']."authorized")){
return true;
} else {
$this->logout();
}
}
//login, verify the user's credentials and give him/her acces
protected function login($username = '',$password = '',$redirect = '')
{
if((!empty($username)) && (!empty($password)) && ($_SERVER['HTTP_HOST'] == HTTP_HOST) && ($_SERVER['SCRIPT_NAME'] == '/login.php'))
{
$password = hash("sha512",SALTKEY.$password);
$query = $this->db->query("SELECT user_id,adminlvl,ipadres FROM users WHERE username = '".$username."' AND password = '".$password."'");
if($this->db->num_rows($query) != 1)
{
$this->error = "Verkeerde username of password";
return false;
}
else
{
$rec = $this->db->fetch_assoc($query);
$_SESSION['user_id'] = $rec['userid'];
$_SESSION['adminlvl'] = $rec['adminlvl'];
$_SESSION['username'] = $username;
$_SESSION['lastip'] = $rec['ipadres'];
$_SESSION['fingerprint'] = hash("sha512",$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_ENCODING'].$_SERVER['DOCUMENT_ROOT']."authorized");
if(!empty($redirect))
{
header("Location: ".$redirect);
}
else
{
if(SSL == "1")
{
header("Location: https://".HTTP_HOST."/");
}
else
{
header("Location: http://".HTTP_HOST."/");
}
}
return true;
}
}
else
{
$this->error = "Aanmelden mislukt";
return false;
}
}
//logout, safely destroy the acces token and redirect the user to the login form
public function logout()
{
unset($_SESSION);
session_destroy();
header('Location:/login/');
exit();
}
}
$auth = new authorization();
?>
//class.auth.php
//last modified 19/07/2009
//version 1.0
class authorization {
public $minlvl = null;
public $error = null;
private $db = null;
function __construct($minlvl = '0')
{
$this->minlvl = $minlvl;
$this->db = new database();
$this->login_check();
}
//login_check, checks if user has acces to the current page
protected function login_check()
{
if (($_SERVER['REQUEST_URI'] == "/login/") or ($this->minlvl == "0")){
return false;
}
if ($_SESSION['adminlvl'] < $this->minlvl){
$this->logout();
}
if($_SESSION['fingerprint'] == hash("sha512",$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_ENCODING'].$_SERVER['DOCUMENT_ROOT']."authorized")){
return true;
} else {
$this->logout();
}
}
//login, verify the user's credentials and give him/her acces
protected function login($username = '',$password = '',$redirect = '')
{
if((!empty($username)) && (!empty($password)) && ($_SERVER['HTTP_HOST'] == HTTP_HOST) && ($_SERVER['SCRIPT_NAME'] == '/login.php'))
{
$password = hash("sha512",SALTKEY.$password);
$query = $this->db->query("SELECT user_id,adminlvl,ipadres FROM users WHERE username = '".$username."' AND password = '".$password."'");
if($this->db->num_rows($query) != 1)
{
$this->error = "Verkeerde username of password";
return false;
}
else
{
$rec = $this->db->fetch_assoc($query);
$_SESSION['user_id'] = $rec['userid'];
$_SESSION['adminlvl'] = $rec['adminlvl'];
$_SESSION['username'] = $username;
$_SESSION['lastip'] = $rec['ipadres'];
$_SESSION['fingerprint'] = hash("sha512",$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_ENCODING'].$_SERVER['DOCUMENT_ROOT']."authorized");
if(!empty($redirect))
{
header("Location: ".$redirect);
}
else
{
if(SSL == "1")
{
header("Location: https://".HTTP_HOST."/");
}
else
{
header("Location: http://".HTTP_HOST."/");
}
}
return true;
}
}
else
{
$this->error = "Aanmelden mislukt";
return false;
}
}
//logout, safely destroy the acces token and redirect the user to the login form
public function logout()
{
unset($_SESSION);
session_destroy();
header('Location:/login/');
exit();
}
}
$auth = new authorization();
?>
sha256 is ook aanzienlijk sneller dan 512 trouwens: http://nl.php.net/manual/en/function.hash.php kijk eerste comment
Gewijzigd op 01/01/1970 01:00:00 door Deze site laat je geen account deleten
ik gebruik geen mysql_real_escape_string, omdat ik niet altijd mysql gebruik.
Dit systeem moet met meerdere SQL databases kunnen werken dus afhankelijk van welke database class jij inlaad (pgsql,mysql,mssql). Alle beveiliging omtrent de database worden uitgevoerd in de database class waar een query dus BV: door mysql_real_escape_string gaat. (in de mysql versie van de database class dan).
Hoe ga je een volledige query door een escape functie halen? En waarom gebruik je dan geen pdo? Dan hoef je niet je eigen database classes te schrijven.
ik heb gevraagd om de veiligheid van de login class te bespreken, niet over de de verwerking van de query's die wordt veilig afgehandeld door mijn intelligente database class die uitleest waar de user input zich bevind.
mensen graag bekritiseren over de veiligheid van het login systeem en eventuele tips, verbeteringen.
Je vraagt mensen naar de beveiliging.
Wij kunnen niet zien wat jou database class doet. Ik vind het dus geen rare vraag waarom mensen zich afvragen waarom je geen foutafhandeling in je query toepast, dat kan je nergens terug vinden.
Misschien handig om dat deel er dus even bij te plaatsen, dan is het voor iedereen duidelijk! :)