IP-Adressen filtern mittels preg_match

digiTAL

Erfahrenes Mitglied
Seid gegrüßt.

Ich bin schon seit längerem dabei, einen hervorragenden PHP Counter zu basteln, der nur die "echten" Besucher zählt. Klappt auch alles wunderbar... Nur wollte ich die IP's besser Filtern!

Dies kann man mittels preg_match sehr gut bewerkstelligen, nur steige ich nicht ganz dahinter wie ich das umsetzen soll!

Ich habe hier mal ein paar Beispiel IP-Adressen:

33.34.35.36
33.34.37.38
33.34.39.40

Kann man das so filtern oder wie kann man die letzten beiden Zahlen variabel integrieren?

PHP:
preg_match('/33.34.[0-255].[0-255]/');
 
Eine Zeichenklasse beschreibt immer genau nur ein Zeichen. In deinem Fall bedeuten die Zeichenklassen, dass die Zeichen 0–2 und 5 erlaubt sind. Um die Zeichenfolgen 0–255 auszudrücken, ist Folgendes möglich:
Code:
25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d
Also:
Code:
33\.34(?:\.25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d){2}
 
Ich habe es versucht so zu lösen:

PHP:
<?

if ($_SERVER["HTTP_X_FORWARDED_FOR"] == TRUE) {
$split = explode(",", $_SERVER["HTTP_X_FORWARDED_FOR"]);
$userip = $split[1];

} elseif ($_SERVER["REMOTE_ADDR"] == TRUE) {
$userip = $_SERVER["REMOTE_ADDR"];

} else {
$userip = NULL;
}

$normal_ip = array(
"4.79.245.66",
"67.15.207.27",
"68.114.23.137",
"70.130.191.85",
"70.185.157.31",
"70.234.230.65",
"72.237.74.171",
"83.135.230.55",
"84.94.38.121",
"84.176.53.235",
"85.124.129.156",
"85.214.37.139",
"87.5.5.221",
"87.187.97.227",
"89.204.159.46",
"131.107.0.95",
"207.57.21.71",
"209.85.73.25",
"209.160.65.31",
"212.72.173.5",
"212.162.14.235",
"212.227.83.149",
"222.46.18.34",
);

$sonder_ip = array(
"(72)\.(232)\.([0-2][0-5][0-5])\.([0-2][0-5][0-5])",
"(85)\.(25)\.([0-2][0-5][0-5])\.([0-2][0-5][0-5])",
"(127)\.(0)\.([0-2][0-5][0-5])\.([0-2][0-5][0-5])",
"(192)\.(168)\.([0-2][0-5][0-5])\.([0-2][0-5][0-5])",
"(195)\.(93)\.([0-2][0-5][0-5])\.([0-2][0-5][0-5])",
"(195)\.(225)\.([0-2][0-5][0-5])\.([0-2][0-5][0-5])",
);

$suchmuster = array(
"agent",
"archive[r]",
"anonym",
"bot",
"client",
"crawl[er]",
"francis",
"image",
"java",
"jeeves",
"jigsaw",
"lib(?:cur|www)",
"link",
"mail",
"meta",
"microsoft",
"oegp",
"search",
"seeker",
"snappy",
"sp[iy]der",
"unknown",
"url",
"w3c",
"yahoo",
);


/* C O U N T E R */

if (!preg_match('/' .implode('|', $suchmuster). '/i', $_SERVER['HTTP_USER_AGENT']) && !preg_match('/' .implode('|', $sonder_ip). '/', $userip) && !in_array($userip, $normal_ip))
{

print "echter Besucher | " .$userip. "";

}
else
{

print "Spider oder Bot | " .$userip. "";

}

?>

Naja das durchsuchen in $sonder_ip scheint nicht ganz zu funktionieren...
Woran liegt das?
 
Probiers mal so aus:

$sonder_ip = array(
"72.232.([0-2][0-5][0-5]).([0-2][0-5][0-5])",
"85.25.([0-2][0-5][0-5]).([0-2][0-5][0-5])",
"127.0.([0-2][0-5][0-5]).([0-2][0-5][0-5])",
"192.168.([0-2][0-5][0-5]).([0-2][0-5][0-5])",
"195.93.([0-2][0-5][0-5]).([0-2][0-5][0-5])",
"195.225.([0-2][0-5][0-5]).([0-2][0-5][0-5])",
);
 
Hi,

leider klappt das auch nicht! Aber ich könnte das Problem gefunden haben!

Wenn ich mit einer Test IP (72.232.56.3 in $sonder_ip verankert) den durchlauf starte, dann wird dise als echter Besucher gewertet, obwohl die IP eigentlich nicht zulässig ist.

Es liegt am Code, so wie er jetzt ausgerichtet ist, erwartet dieser das die letzten beiden Zahlen der IP Adresse 3 Zeichen enthalten (also 72.232.114.145) und bei meiner Test IP (72.232.56.3) ist das ja nicht der fall!

Wie kann ich das denn ändern, das er auch bei weniger zeichen in den letzten beiden zahlen sperrt?
 
Zurück