-
Notifications
You must be signed in to change notification settings - Fork 1
/
ipblock.php
128 lines (111 loc) · 3.95 KB
/
ipblock.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
<?php
// prüft, ob IP-Adresse der Notation entspricht
function CheckIP($ipadr)
{
$state = 1;
$count = 0;
$told = 0;
$ipadr = $ipadr . ".";
for ($t = 0; $t < strlen($ipadr); $t++) {
if ($ipadr[$t] == ".") {
$count++;
$nums = substr($ipadr, $told, $t - $told);
if ((strlen($nums) > 3) || (strlen($nums) == 0)) {
$state = 0;
break;
}
// regulärer Ausdruck - suche, ob etwas außer 0-9 vorhanden ist
if (preg_match("/[^0-9]/", $nums)) {
$state = 0;
break;
}
$told = $t + 1;
}
}
if ($count != 4) {
$state = 0;
}
return $state;
}
// macht aus der IP eine genormte ...
function NormIP($sIpadr)
{
$aZ = array(
'00',
'0',
''
);
$sIppart = '';
$sNewIP = '';
for ($t = 0; $t < strlen($sIpadr); $t++) {
if (($sIpadr[$t]) == '.') {
$sIppart = $aZ[strlen($sIppart) - 1] . $sIppart . '.';
$sNewIP = $sNewIP . $sIppart;
$sIppart = '';
} else {
$sIppart = $sIppart . $sIpadr[$t];
}
}
$sNewIP = $sNewIP . $aZ[strlen($sIppart) - 1] . $sIppart;
return $sNewIP;
}
// prüft, ob fehlerhafter Login des Nutzer 3 mal erfolgt ist, falls z.B. von verschiedenen IPs
function CheckIPBlock($nutzername)
{
global $sDatabase;
$hDatabase = OpenDB($sDatabase);
$logins = SQLArrayQuery($hDatabase, "SELECT nr,benutzer,zeit,ereignis FROM logfile WHERE benutzer='" . $nutzername . "' AND ereignis='Login fehlgeschlagen' ORDER BY nr DESC");
if (sizeof($logins) > 2) {
// letzter Login auf IP
$zeitabstand = date("U") - $logins[0]['zeit'];
// 15 Minuten her ?
if (($zeitabstand / 60) < 15) {
$zeitabstand = $logins[0]['zeit'] - $logins[2]['zeit'];
// liegen die 3 Logins in einem Zeitfenster von 5 Minuten ?
if (($zeitabstand / 60) < 5) {
SQLQuery($hDatabase, "INSERT INTO logfile (ipadresse,zeit,benutzer,ereignis) VALUES ('" . ip2long($ipadr) . "','" . date("U") . "','" . $nutzername . "','Nutzer-Sperre')");
CloseDB($hDatabase);
$aParam['_display_'] = 'block';
$aParam['_error_'] = 'Zugriff wegen fehlgeschlagener<br>Loginversuche verweigert !';
ShowGui('login.html', $aParam);
}
}
}
CloseDB($hDatabase);
}
// prüft vor Zugriff, ob zulässige IP oder IPSperre (3 mal fehlgeschlagener Loginversuch von einer IP-Adresse)
function IPSperre()
{
global $sDatabase;
// Darf von der IP-Adresse zugegriffen werden ?
$hDatabase = OpenDB($sDatabase);
$ipadr = getenv('REMOTE_ADDR');
$logins = SQLArrayQuery($hDatabase, "SELECT ipadresse FROM security WHERE ipadresse='" . ip2long($ipadr) . "'");
// ist die gewählte IP des Nutzer freigeschaltet ?
if (sizeof($logins) == 0) {
SQLQuery($hDatabase, "INSERT INTO logfile (ipadresse,zeit,benutzer,ereignis) VALUES ('" . ip2long($ipadr) . "','" . date("U") . "','Unbekannt','Unzulässige IP')");
CloseDB($hDatabase);
header("HTTP/1.1 404 Not Found");
ShowGui('404.html', null);
die;
}
$logins = SQLArrayQuery($hDatabase, "SELECT nr,ipadresse,zeit,ereignis FROM logfile WHERE ipadresse='" . ip2long($ipadr) . "' AND ereignis='Login fehlgeschlagen' ORDER BY nr DESC");
// auf der selben IP mindestens 3 fehlgeschlagene Logins ..
if (sizeof($logins) > 2) {
// letzter Login auf IP
$zeitabstand = date("U") - $logins[0]['zeit'];
// weniger als 15 Minuten her ?
if (($zeitabstand / 60) < 15) {
$zeitabstand = $logins[0]['zeit'] - $logins[2]['zeit'];
// liegen die 3 Logins in einem Zeitfenster von 5 Minuten ?
if (($zeitabstand / 60) < 5) {
SQLQuery($hDatabase, "INSERT INTO logfile (ipadresse,zeit,benutzer,ereignis) VALUES ('" . ip2long($ipadr) . "','" . date("U") . "','Unbekannt','IP-Sperre')");
CloseDB($hDatabase);
$aParam['_display_'] = 'block';
$aParam['_error_'] = 'Zugriff wegen fehlgeschlagener<br>Loginversuche verweigert !';
ShowGui('login.html', $aParam);
}
}
}
CloseDB($hDatabase);
}