input-checken
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
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?php
// 2 variabele die gezet moeten zijn om de functie te laten werken.
// $userinput bevat de superglobals die gecheckt moeten worden ($_COOKIE hoeft bijvoorbeeld niet altijd gecheck te worden)
// Onthoud: Zet als key ALTIJD neer welke global het is (GET, POST of COOKIE)
$userinput = array('GET' => $_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE);
// $checks bevat een paar extra checks voor bepaalde inputvariabelen.
$checks = array();
// Deze functie word gebruikt als er iets niet klopt in de checks:
// Voorbeeld: Er staat een letter in een waarde die alleen uit cijfers mag bestaan.
function abort ($soort = '', $key = '')
{
global $userinput;
// Hier zou je de fout kunnen noteren (in een .txt bestand of DB ofzo)
$logfile = fopen("errorlog.txt", "a");
fputs($logfile, htmlentities('$_'.$soort.'['.$key.'] = '.$userinput[$soort][$key])." : ".date("Y-m-d H:i:s").", ".$_SESSION['memberid'].", ".$_SERVER['REMOTE_ADDR'].", ".$_SERVER['PHP_SELF']." \r\n");
fclose($logfile);
// Hier kan je ook een melding echoën, of redirechten of includen of iets anders
echo 'De inputwaarden zijn gemanipuleerd!';
// Een exit(); om te voorkomen dat er iets gedaan word met de foutive data.
// Dit wil je natuurlijk niet in een SQL hebben.
exit();
}
function check_input($userinput = 'x', $checks = array())
{
if ($userinput == 'x') {
$userinput = array('GET' => $_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE);
}
// De $userinput goed zetten (al je get hebt staan veranderen naar GET)
foreach ($userinput as $key => $value)
{
if ($key != strtoupper($key))
{
unset($userinput[$key]);
$userinput[strtoupper($key)] = $value;
}
}
// Beginnen met checken
// De checks zoals NUM zijn NIET hoofdlettergevoelig!
// Als er niet aan de checks word voldaan, word het hele script gestopt! (zie de functie abort)
foreach ($checks as $input => $array)
{
foreach ($array as $key => $value)
{
// Als NUM in de check gevonden word, MOET de waarde een nummer zijn! Anders stopt het script!
if (eregi('num', $value) && (!is_numeric($userinput[$input][$key]) && !empty($userinput[$input][$key])))
{
return abort($input, $key);
}
// Als MySQL in de check gevonden word, Word er mysql_real_escape_string() over de waarde gezet!
// Onthoud dat je een MySQL waarde NIET kan echoën! Dus als je de waarde ook moet echoën,
// Dan moet je dit niet gebruiken en later alsnog mysql_real_escape_string() in combinatie met stripslashes()
$mysql = false;
if (eregi('mysql', $value) && !empty($userinput[$input][$key]))
{
$mysqlvalue = $userinput[$input][$key];
if (get_magic_quotes_gpc() == true)
{
$mysqlvalue = stripslashes($mysqlvalue);
}
$userinput[$input][$key] = mysql_real_escape_string($mysqlvalue);
// Als $mysql op true staat, dan word er later geen addslashes meer overheen gedaan
$mysql = true;
}
// Html uitschakelen, zodat er niks kan ge-parsed worden door een input.
if (eregi('html', $value) && !empty($userinput[$input][$key]))
{
$userinput[$input][$key] = htmlentities($mysqlvalue);
}
// Als length(parameter1, parameter2, parameter3) in de check gevonden word, word dit gedaan:
// parameter1: Minimaal aantal tekens / getal
// parameter2: Maximaal aantal tekens / getal
// paramater3 is Optioneel:
// Als deze op int staat, moet de waarde tussen parameter1 en parameter2 zitten
// Als deze op string staat (staat hij standaard), moet het aantal tekens tussen parameter1 en parameter2 zitten
if (eregi('length\(([0-9a-z ,])+\)', $value, $search) && !empty($userinput[$input][$key]))
{
// Alle data goed krijgen
$search = str_replace(' ', '', $search);
eregi('\(([0-9a-z,])+\)', $search[0], $length);
$param1 = substr($length[0], 0, 1) == '(' ? 1 : 0;
$param2 = substr($length[0], (strlen($length[0])-1), 1) == ')' ? (strlen($length[0])-1) : strlen($length[0]);
$length = substr($length[0], $param1, ($param2-$param1));
$params = explode(',', $length);
$params[2] = count($params) == 3 ? strtolower($params[2]) : 'string';
// De check eindelijk uitvoeren
if ($params[2] == 'string' && (strlen($userinput[$input][$key]) < $params[0] or strlen($userinput[$input][$key]) > $params[1]))
{
return abort($input, $key);
}
elseif ($params[2] == 'int' && ($userinput[$input][$key] < $params[0] or $userinput[$input][$key] > $params[1]))
{
return abort($input, $key);
}
}
// Als de check een array is, moet de waarde binnen deze array staan.
// Oftewel: Beperkt aantal mogelijkheden, handig voor selectboxen enzo.
if (is_array($value) && !empty($userinput[$input][$key]))
{
$found = false;
foreach ($value as $opties)
{
if ($opties == $userinput[$input][$key])
{
$found = true;
}
}
if ($found == false)
{
return abort($input, $key);
}
}
}
}
// Hier word de input dan gevalidieerd
foreach ($userinput as $input => $array)
{
foreach ($array as $key => $value)
{
$newvalue = $value;
// Eerst mogelijke oude slashes verwijderen en daarna weer toevoegen (zodat je nooit \\\\\\' kan krijgen)
// Dit gebeurd alleen als er geen mysql_real_escape_string() overheen is gedaan!
if ($mysql == false) {
$newvalue = stripslashes($newvalue);
$newvalue = addslashes($newvalue);
}
// Alle vernieuwde waarden terugstoppen in de juiste superglobal.
if ($input == 'GET')
{
$_GET[$key] = $newvalue;
}
if ($input == 'POST')
{
$_POST[$key] = $newvalue;
}
if ($input == 'COOKIE')
{
$_COOKIE[$key] = $newvalue;
}
}
}
}
// De functie aanroepen:
check_input($userinput, $checks);
?>
// 2 variabele die gezet moeten zijn om de functie te laten werken.
// $userinput bevat de superglobals die gecheckt moeten worden ($_COOKIE hoeft bijvoorbeeld niet altijd gecheck te worden)
// Onthoud: Zet als key ALTIJD neer welke global het is (GET, POST of COOKIE)
$userinput = array('GET' => $_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE);
// $checks bevat een paar extra checks voor bepaalde inputvariabelen.
$checks = array();
// Deze functie word gebruikt als er iets niet klopt in de checks:
// Voorbeeld: Er staat een letter in een waarde die alleen uit cijfers mag bestaan.
function abort ($soort = '', $key = '')
{
global $userinput;
// Hier zou je de fout kunnen noteren (in een .txt bestand of DB ofzo)
$logfile = fopen("errorlog.txt", "a");
fputs($logfile, htmlentities('$_'.$soort.'['.$key.'] = '.$userinput[$soort][$key])." : ".date("Y-m-d H:i:s").", ".$_SESSION['memberid'].", ".$_SERVER['REMOTE_ADDR'].", ".$_SERVER['PHP_SELF']." \r\n");
fclose($logfile);
// Hier kan je ook een melding echoën, of redirechten of includen of iets anders
echo 'De inputwaarden zijn gemanipuleerd!';
// Een exit(); om te voorkomen dat er iets gedaan word met de foutive data.
// Dit wil je natuurlijk niet in een SQL hebben.
exit();
}
function check_input($userinput = 'x', $checks = array())
{
if ($userinput == 'x') {
$userinput = array('GET' => $_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE);
}
// De $userinput goed zetten (al je get hebt staan veranderen naar GET)
foreach ($userinput as $key => $value)
{
if ($key != strtoupper($key))
{
unset($userinput[$key]);
$userinput[strtoupper($key)] = $value;
}
}
// Beginnen met checken
// De checks zoals NUM zijn NIET hoofdlettergevoelig!
// Als er niet aan de checks word voldaan, word het hele script gestopt! (zie de functie abort)
foreach ($checks as $input => $array)
{
foreach ($array as $key => $value)
{
// Als NUM in de check gevonden word, MOET de waarde een nummer zijn! Anders stopt het script!
if (eregi('num', $value) && (!is_numeric($userinput[$input][$key]) && !empty($userinput[$input][$key])))
{
return abort($input, $key);
}
// Als MySQL in de check gevonden word, Word er mysql_real_escape_string() over de waarde gezet!
// Onthoud dat je een MySQL waarde NIET kan echoën! Dus als je de waarde ook moet echoën,
// Dan moet je dit niet gebruiken en later alsnog mysql_real_escape_string() in combinatie met stripslashes()
$mysql = false;
if (eregi('mysql', $value) && !empty($userinput[$input][$key]))
{
$mysqlvalue = $userinput[$input][$key];
if (get_magic_quotes_gpc() == true)
{
$mysqlvalue = stripslashes($mysqlvalue);
}
$userinput[$input][$key] = mysql_real_escape_string($mysqlvalue);
// Als $mysql op true staat, dan word er later geen addslashes meer overheen gedaan
$mysql = true;
}
// Html uitschakelen, zodat er niks kan ge-parsed worden door een input.
if (eregi('html', $value) && !empty($userinput[$input][$key]))
{
$userinput[$input][$key] = htmlentities($mysqlvalue);
}
// Als length(parameter1, parameter2, parameter3) in de check gevonden word, word dit gedaan:
// parameter1: Minimaal aantal tekens / getal
// parameter2: Maximaal aantal tekens / getal
// paramater3 is Optioneel:
// Als deze op int staat, moet de waarde tussen parameter1 en parameter2 zitten
// Als deze op string staat (staat hij standaard), moet het aantal tekens tussen parameter1 en parameter2 zitten
if (eregi('length\(([0-9a-z ,])+\)', $value, $search) && !empty($userinput[$input][$key]))
{
// Alle data goed krijgen
$search = str_replace(' ', '', $search);
eregi('\(([0-9a-z,])+\)', $search[0], $length);
$param1 = substr($length[0], 0, 1) == '(' ? 1 : 0;
$param2 = substr($length[0], (strlen($length[0])-1), 1) == ')' ? (strlen($length[0])-1) : strlen($length[0]);
$length = substr($length[0], $param1, ($param2-$param1));
$params = explode(',', $length);
$params[2] = count($params) == 3 ? strtolower($params[2]) : 'string';
// De check eindelijk uitvoeren
if ($params[2] == 'string' && (strlen($userinput[$input][$key]) < $params[0] or strlen($userinput[$input][$key]) > $params[1]))
{
return abort($input, $key);
}
elseif ($params[2] == 'int' && ($userinput[$input][$key] < $params[0] or $userinput[$input][$key] > $params[1]))
{
return abort($input, $key);
}
}
// Als de check een array is, moet de waarde binnen deze array staan.
// Oftewel: Beperkt aantal mogelijkheden, handig voor selectboxen enzo.
if (is_array($value) && !empty($userinput[$input][$key]))
{
$found = false;
foreach ($value as $opties)
{
if ($opties == $userinput[$input][$key])
{
$found = true;
}
}
if ($found == false)
{
return abort($input, $key);
}
}
}
}
// Hier word de input dan gevalidieerd
foreach ($userinput as $input => $array)
{
foreach ($array as $key => $value)
{
$newvalue = $value;
// Eerst mogelijke oude slashes verwijderen en daarna weer toevoegen (zodat je nooit \\\\\\' kan krijgen)
// Dit gebeurd alleen als er geen mysql_real_escape_string() overheen is gedaan!
if ($mysql == false) {
$newvalue = stripslashes($newvalue);
$newvalue = addslashes($newvalue);
}
// Alle vernieuwde waarden terugstoppen in de juiste superglobal.
if ($input == 'GET')
{
$_GET[$key] = $newvalue;
}
if ($input == 'POST')
{
$_POST[$key] = $newvalue;
}
if ($input == 'COOKIE')
{
$_COOKIE[$key] = $newvalue;
}
}
}
}
// De functie aanroepen:
check_input($userinput, $checks);
?>