IP-Adressen filtern mittels preg_match

digiTALE

Lt. Junior Grade
Registriert
Juli 2004
Beiträge
270
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!

So sieht der bisherige Code aus!
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"
);

$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. "";

}

?>

Die IP's unter $sonder_ip werden irgendwie nicht überprüft wenn ich z.B. 72.232.55.3 als test IP angebe! Woran kann das liegen?

Mfg chriZ
 
Es liegt daran, daß kein Pattern innerhalb von $sonder_ip auf '72.232.55.3' matcht, die Pattern setzen voraus, daß die dritten und vierten Oktette dreistellig sind.

greetings, Keita
 
Keita hat ja bereits geschrieben das an den letzten beiden Oktette 3 stellige Werte erwarten, allerdings werden selbst dann nicht alle Möglichkeiten berücksichtigt.

Du überprüfst momentan folgende Wertebereiche ([0-2][0-5][0-5])

000 - 005
010 - 015
020 - 025
030 - 035
040 - 045
050 - 055

100 - 105
110 - 115
120 - 125
130 - 135
140 - 145
150 - 155

200 - 205
210 - 215
220 - 225
230 - 235
240 - 245
250 - 255

Wie du siehst ist das nur ein Bruchteil der möglichen Kombinationen! Abgesehen davon erwartest du führende Nullen. Was du suchst ist ein Vergleich nach dem folgenden Muster: ([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])
 
Ich habe jetzt noch eine andere einfache Lösung gefunden...

PHP:
$sonder_ip = array(
	"72.232.*.*",
	"85.25.*.*",
	"127.0.*.*",
	"192.168.*.*",
	"195.93.*.*",
	"195.225.*.*",
);

Sollte doch auch für einen Counter ausreichen wenn ich die letzten beiden Oktette sperren will!?

Mfg chriZ
 
gehen würde das, letztlich brauchst du auch keine regulrären ausdrücke. Aber wie immer gilt auch hier: viele wege führen nach rom ;-)

PHP:
$compare = "77.232.5.9";

$sonder_ip = array(
    "72.232.",
    "85.25.",
    "127.0.",
    "192.168.",
    "195.93.",
    "195.225.",
);


$gesperrt = false;
$c = count( $sonder_ip );
for( $i=0;$i<$c;$i++ )
{
	if ( strncmp( $sonder_ip[$i], $compare, strlen($sonder_ip[$i]) ) == 0 )
	{
		$gesperrt = true;
		break;
	}
}

echo "gesperrt: " . ($gesperrt?"ja":"nein");
 
Noch ein Weg nach Rom:
Man kann's auch arithmetisch lösen, in dem man einfach die numerischen Werte der IP-Bereiche nimmt und diese mit der numerischen Repräsentation der IP des Besuchers vergleicht :D

greetings, Keita
 
Also, ich habe die IP- Adressen nochmal überarbeitet und hat auch alles funktioniert, nur hab ich meinen Counter nochmals überarbeitet und teilweise stuft er jetzt echte Besucher als BOT ein...

Er hat bis jetzt nur Besucher mit der IP 84.*.*.* als BOT eingestuft, meine IP mit 88.*.*.* hat er als echter Besucher gewertet. Steckt der Fehler in der "$gesperrte_ip" drin? Der Browser war bei allen der Firefox!

Momentan sieht der Quellcode so aus:
PHP:
<?

// E I N S T E L L U N G E N

$ipsperre = 86400;					// 43200 sec = 12h | 86400 sec = 24h | 172800 sec = 48h


// IP-Adressen von Bots und Spider
$gesperrte_ip = array(
	"4\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"12\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"24\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"64\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"65\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"66\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"67\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"68\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"69\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"70\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"71\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"72\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"74\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"75\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"76\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"83\.135\.230\.55",
	"84\.164\.78\.243",
	"84\.164\.103\.168",
	"84\.176\.53\.235",
	"85\.25\.141\.66",
	"85\.124\.129\.156",
	"87\.5\.5\.221",
	"87\.118\.110\.210",
	"87\.187\.97\.227",
	"89\.204\.159\.46",
	"96\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"97\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"98\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"99\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"124\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"131\.107\.[0-9]{1,3}\.[0-9]{1,3}",
	"141\.91\.129\.[0-9]{1,3}",
	"192\.168\.[0-9]{1,3}\.[0-9]{1,3}",
	"195\.93\.[0-9]{1,3}\.[0-9]{1,3}",
	"195\.225\.[0-9]{1,3}\.[0-9]{1,3}",
	"200\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",
	"206\.53\.51\.126",
	"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"
);


// unzulaessige Provider
$gesperrte_provider = array(
	"comcast",
	"res\.rr",
	"optonline",
	"cable\.rogers",
	"insightbb"
);


// Suchmuster nachdem die Bots und Spider ausgemustert werden
$suchmuster = array(
	"agent",
	"archive",
	"anonym",
	"bot",
	"client",
	"crawl",
	"francis",
	"google",
	"java",
	"jeeves",
	"jigsaw",
	"link",
	"mail",
	"meta",
	"oegp",
	"proxy",
	"search",
	"seeker",
	"snappy",
	"sp[iy]der",
	"track",
	"unknown",
	"url",
	"w3c",
	"yahoo",
);

// Zugelassene Browser
$browser = array(
					"mozilla\/5\.0 \((.*)\)",
					"mozilla\/4\.0 \((.*)\)",
					"opera\/?([0-9.]+)?"
				);



// C O U N T E R

// ----------------------| Am nachfolgenden Script nichts aendern |---------------------- //


$besucher_ip       = $_SERVER["REMOTE_ADDR"];
$besucher_browser  = $_SERVER['HTTP_USER_AGENT'];
$besucher_provider = gethostbyaddr($besucher_ip);


$splitten          = explode(".", $besucher_ip);
$ipaddr            = $splitten[0] . "." . $splitten[1] . "." . $splitten[2] . ".";


// pruefen ob Besucher IP noch nicht vorhanden
if (mysql_num_rows(mysql_query("SELECT * FROM log_ip WHERE ip LIKE '" . $ipaddr . "%' ")) == 0)
{

	// Browser und Provider auf Zulaessigkeit pruefen
	if (preg_match('/' . implode('|', $browser) . '/i', $besucher_browser) && !preg_match('/' . implode('|', $gesperrte_provider) . '/i', $besucher_provider))
	{

		// Ausmusterung
		if (!preg_match('/' .implode('|', $suchmuster). '/i', $besucher_browser) && !preg_match('/' .implode('|', $gesperrte_ip). '/', $besucher_ip))
		{

			//
			// BESUCHER
			//

			mysql_query("INSERT INTO counta_ip (`datum`,`ip`) VALUES ( '" . time() . "', '" . $besucher_ip . "' )") or die (mysql_error());

			mysql_query("UPDATE counta_hits SET hits = hits + 1 LIMIT 1") or die (mysql_error());

		}
		else
		{

			//
			// BOT
			//

			mysql_query("DELETE FROM counta_ip WHERE datum < " . (time() - 86400) . "") or die (mysql_error());

			mysql_query("
							INSERT INTO
										counta_bot (`datum`,`ip`,`agent`,`referer`,`provider`)
							VALUES (
										'" . time() . "',
										'" . $besucher_ip . "',
										'" . $besucher_browser . "',
										'" . $besucher_referer . "',
										'" . $besucher_provider . "'
									)
						") or die (mysql_error());

			mysql_query("INSERT INTO counta_ip (`datum`,`ip`) VALUES ( '" . time() . "', '" . $besucher_ip . "' )") or die (mysql_error());

		}

	}
	else
	{

		//
		// BOT
		//

		mysql_query("
						INSERT INTO
									counta_bot (`datum`,`ip`,`agent`,`referer`,`provider`)
						VALUES (
									'" . time() . "',
									'" . $besucher_ip . "',
									'[+] " . $besucher_browser . "',
									'" . $besucher_referer . "',
									'" . $besucher_provider . "'
								)
					") or die (mysql_error());

		mysql_query("INSERT INTO counta_ip (`datum`,`ip`) VALUES ( '" . time() . "', '" . $besucher_ip . "' )") or die (mysql_error());

	}

}

?>
 
Zuletzt bearbeitet:
Zurück
Oben