php security check
bedankt
add_user.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
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
<?php
if ($_SERVER['REQUEST_METHOD']=='POST'){
require_once('../connect.php');
dbconnect();
$username = $_POST['username'];
$password = sha1($_POST['password']);
$password2 = sha1($_POST['password2']);
$level = $_POST['level'];
if(!empty($username)){
if(!empty($password)){
if($password != $password2){
echo 'De paswoorden komen niet overeen';
}else{
$sql = mysql_query("INSERT INTO login (username,password,level) VALUES('".$username."','".$password."','".$level."') ")
or die(mysql_error());
echo $username.' is aangemaakt.';
}
}else{
echo 'Gelieve een paswoord in te vullen';
}
}else{
echo'Gelieve een username in te vullen';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="add_user.php">
<table border="1">
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>Confirm Password:</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>Level:</td>
<td><select name="level">
<option value="admin">Administrator</option>
<option value="user">Gebruiker</option>
</select></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="knop" value="Versturen" /> </td>
</tr>
</table>
</form>
</body>
</html>
if ($_SERVER['REQUEST_METHOD']=='POST'){
require_once('../connect.php');
dbconnect();
$username = $_POST['username'];
$password = sha1($_POST['password']);
$password2 = sha1($_POST['password2']);
$level = $_POST['level'];
if(!empty($username)){
if(!empty($password)){
if($password != $password2){
echo 'De paswoorden komen niet overeen';
}else{
$sql = mysql_query("INSERT INTO login (username,password,level) VALUES('".$username."','".$password."','".$level."') ")
or die(mysql_error());
echo $username.' is aangemaakt.';
}
}else{
echo 'Gelieve een paswoord in te vullen';
}
}else{
echo'Gelieve een username in te vullen';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="add_user.php">
<table border="1">
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>Confirm Password:</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>Level:</td>
<td><select name="level">
<option value="admin">Administrator</option>
<option value="user">Gebruiker</option>
</select></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="knop" value="Versturen" /> </td>
</tr>
</table>
</form>
</body>
</html>
login.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
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
<?php
if ($_SERVER['REQUEST_METHOD']=='POST'){
require_once('../connect.php');
dbconnect();
$username = mysql_escape_string($_POST['username']);
$password = sha1($_POST['password']);
$sql = "SELECT username,level,status FROM login WHERE username = '".$username."' AND password = '".$password."'";
$result = mysql_query($sql);
if(mysql_num_rows($result) <1){
/* Login mislukt */
echo "Gelieve uw gebruikersnaam en uw paswoord te controleren.<br/>";
}else{
/*login gelukt*/
echo "U bent succesvol ingelogd.<br/>";
$row = mysql_fetch_object($result);
$status = htmlspecialchars($row->status);
$level = htmlspecialchars($row->level);
$_SESSION['user'] = $username;
$_SESSION['user_status'] = $status;
$_SESSION['level'] = $level;
if($_SESSION['user_status'] >0){
header('Location:user_list.php');
echo 'ok';
}else{
echo "Er is een probleem met uw status, gelieve de verantwoordelijke te contacteren.<br/>";
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="login.php">
<table border="1">
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /> </td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="knop" value="Versturen" /> </td>
</tr>
</table>
</form>
</body>
</html>
if ($_SERVER['REQUEST_METHOD']=='POST'){
require_once('../connect.php');
dbconnect();
$username = mysql_escape_string($_POST['username']);
$password = sha1($_POST['password']);
$sql = "SELECT username,level,status FROM login WHERE username = '".$username."' AND password = '".$password."'";
$result = mysql_query($sql);
if(mysql_num_rows($result) <1){
/* Login mislukt */
echo "Gelieve uw gebruikersnaam en uw paswoord te controleren.<br/>";
}else{
/*login gelukt*/
echo "U bent succesvol ingelogd.<br/>";
$row = mysql_fetch_object($result);
$status = htmlspecialchars($row->status);
$level = htmlspecialchars($row->level);
$_SESSION['user'] = $username;
$_SESSION['user_status'] = $status;
$_SESSION['level'] = $level;
if($_SESSION['user_status'] >0){
header('Location:user_list.php');
echo 'ok';
}else{
echo "Er is een probleem met uw status, gelieve de verantwoordelijke te contacteren.<br/>";
}
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="login.php">
<table border="1">
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /> </td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="knop" value="Versturen" /> </td>
</tr>
</table>
</form>
</body>
</html>
connect.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
session_start();
ob_start();
/**
* $cfg is een array waarin je alle instellingen voor je php scripts opslaat.
*/
$cfg = array();
$cfg['dbHost'] = "localhost";
$cfg['dbUser'] = "user";
$cfg['dbPass'] = "***";
$cfg['dbName'] = "db";
function dbConnect() {
global $cfg;
$conn = mysql_connect( $cfg['dbHost'], $cfg['dbUser'], $cfg['dbPass'] ) or trigger_error( "Database verbinding kon niet worden gecreerd.", E_USER_WARNING );
mysql_select_db( $cfg['dbName'], $conn ) or trigger_error( "Database niet gevonden!", E_USER_WARNING );
return $conn;
}
?>
session_start();
ob_start();
/**
* $cfg is een array waarin je alle instellingen voor je php scripts opslaat.
*/
$cfg = array();
$cfg['dbHost'] = "localhost";
$cfg['dbUser'] = "user";
$cfg['dbPass'] = "***";
$cfg['dbName'] = "db";
function dbConnect() {
global $cfg;
$conn = mysql_connect( $cfg['dbHost'], $cfg['dbUser'], $cfg['dbPass'] ) or trigger_error( "Database verbinding kon niet worden gecreerd.", E_USER_WARNING );
mysql_select_db( $cfg['dbName'], $conn ) or trigger_error( "Database niet gevonden!", E_USER_WARNING );
return $conn;
}
?>
safe.php (bestand om te checken of je wel bent ingelogt)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
require_once('../connect.php');
dbconnect();
if(isset($_SESSION['user'])) {
$query = mysql_query("UPDATE login SET lastactive = NOW(),ip = '".$_SERVER['REMOTE_ADDR']."' WHERE username = '".$_SESSION['user']."'");
}else{
header('Location:login.php');
}
?>
require_once('../connect.php');
dbconnect();
if(isset($_SESSION['user'])) {
$query = mysql_query("UPDATE login SET lastactive = NOW(),ip = '".$_SERVER['REMOTE_ADDR']."' WHERE username = '".$_SESSION['user']."'");
}else{
header('Location:login.php');
}
?>
$status = htmlspecialchars($row->status);
$level = htmlspecialchars($row->level);
Dit is tragen. Test van Jan Koehoorn hebben bewezen dan mysql_fetch|_assoc sneler is
Daarna is het het een array en dat werkt makkelijker
Maar opzich is het veilig..
De beste manier om te testen is gewoon proberen te hacken
Voor de rest alle vars als $username enz gewoon niet gebruiken maar gewoon in de var laten staan werkt makkelijker...
Gewijzigd op 01/01/1970 01:00:00 door wouter reyntjens
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?
$username = $_POST['username'];
$a = $username;
$b = $a;
$c = $b;
$d = $c;
// etc. etc.
?>
$username = $_POST['username'];
$a = $username;
$b = $a;
$c = $b;
$d = $c;
// etc. etc.
?>
Het aanmaken van een kopie is volkomen zinloos, kost extra geheugen, levert niks op behalve kansen op veiligheidslekken.
In bovenstaand voorbeeld heeft $d exact dezelfde inhoud als $_POST['username']. Waarom zou je dan alle kopieen aanmaken? Bespaar jezelf deze onzin en doe iets nuttigs met $_POST['username'].
Echter
is heel wat anders! $username is een string die veilig in een query is te gebruiken, dat in grote tegenstelling met $_POST['username']. Deze is namelijk onbruikbaar in een query, is namelijk voor geen cent te vertrouwen.
UPDATE tabel SET kolom1 = '".mysql_real_escape_string($_POST['username'])."'
en:
$username = mysql_real_escape_string($_POST['username']);
UDPATE tabel SET kolom1 = '".$username."' ";
of heb je het hier alleen over de duidelijkheid?
voer maar een een username in met iets met een ' erin of een "; dan krijg je wss meteen fouten.
Code (php)
1
2
3
4
5
2
3
4
5
<?
$username = mysql_real_escape_string($_POST['username']);
$query = "UDPATE tabel SET kolom1 = '".$username."' ";
?>
$username = mysql_real_escape_string($_POST['username']);
$query = "UDPATE tabel SET kolom1 = '".$username."' ";
?>
Deze is beter te onderhouden. En wanneer je een hele waslijst met $_POST-variabelen hebt beveiligd door tig-keer de functie mysql_real_escape() uit te schrijven, dan ga je snel genoeg bedenken dat dit slimmer kan. Een goede programmeur is namelijk lui.
Tip: Gebruik PHP versie 5 en kijk dan eens naar PDO. Hoef je zelf nauwelijks meer wat te doen, veiligheid is gegarandeerd en je kunt vrij simpel van de ene database overstappen op de andere. Misschien moet je hier en daar de SQL een beetje aanpassen, maar dat is het wel. Geen geklooi met specifieke php-database-functies. En daar valt mysql_real_escape_string() ook onder, heb je geen drol aan wanneer je PostgreSQL, Firebird of Oracle gaat gebruiken.