Über den Author / Internet / Proxy blockieren per PHP

Proxy blockieren per PHP

~3 Min. Lesezeit

Proxys können einem das Leben schwer machen. User greifen die Webseite an oder hinterlassen mit einer anonymen IP Adresse beleidigende oder rassistische Kommentare.

Um dem Entgegenzuwirken, gibt es diverse Möglichkeiten. Schnell wechselt der gesperrte User seine IP Adresse dank einem Proxy und er ist wieder da um weiter zu Spamen. User Manuell zu blockieren ist mühsam. Gelegentlich schalte ich vorübergehen einfach ein Blockierscript für Proxyserver aktiv. Nach einer gewissen Zeit gibt es der Spamer auf und verschwindet wieder.

Sobald ich bei einem Dienst übermässige Fehlnutzung von Proxys entdecke, binde ich folgendes PHP Skript ein:

<?php

// Settings
$block_proxy_attemts		= true;   		// true or false
$log_proxy_attemts		= true;   		// true or false
$log_proxy_attemts_to	= "blockedproxy.log";  // Filename or path with filename

// To use this on your own page, please add following line:
// if (block_proxys() == true AND $block_proxy_attemts == true) { exit("Proxys are not allowed to connect to this page, please connect directly"); }

// Please do not change any thing under this comment
function block_proxys()
{
	global $_SERVER, $log_proxy_attemts, $log_proxy_attemts_to;
	$proxy_detected = '0';
	$blockedheaders = array('HTTP_VIA','HTTP_X_FORWARDED_FOR','HTTP_FORWARDED_FOR','HTTP_X_FORWARDED','HTTP_FORWARDED','HTTP_CLIENT_IP','HTTP_FORWARDED_FOR_IP','VIA','X_FORWARDED_FOR','FORWARDED_FOR','X_FORWARDED','FORWARDED','CLIENT_IP','FORWARDED_FOR_IP','HTTP_PROXY_CONNECTION');

	foreach($blockedheaders as $i)
	{
		if($_SERVER[$i] != '') { $proxy_detected++; $log .= $i.", "; }
	}
	  

	if (gethostbyname(ReverseIPOctets($_SERVER['REMOTE_ADDR']).".".$_SERVER['SERVER_PORT'].".".ReverseIPOctets($_SERVER['SERVER_ADDR']).".ip-port.exitlist.torproject.org") == "127.0.0.2")
	{ $proxy_detected++; $log .= "TOR exit node, "; }
	
	if (exists_in_rbl() == true)
	{ $proxy_detected++; $log .= "RBL, "; }

	if ($proxy_detected >= '1')
	{
		if ($log_proxy_attemts == true)
		{
			if (is_writable($log_proxy_attemts_to)) {
				$fp = fopen($log_proxy_attemts_to,"a");
				fwrite($fp,date("Y-m-d H:i:s").": Proxy Server detected: ".gethostbyaddr($_SERVER['REMOTE_ADDR'])." (".$_SERVER['REMOTE_ADDR'].") - Info: ".$log."\n");
				fclose($fp);
			} else {
			    exit("Connection Logfile is not writeable");
			}
		}
		return true;
	}
	else
	{
		return false;
	}	
}

function exists_in_rbl() {
    $rbls = array('http.dnsbl.sorbs.net', 'misc.dnsbl.sorbs.net');
    $remote = getenv('REMOTE_ADDR');

    if (preg_match("/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/",
      $remote, $matches)) {
        foreach ($rbls as $rbl) {
            $rblhost = $matches[4] . "." . $matches[3] . "." .
                $matches[2] . "." . $matches[1] . "." . $rbl;

            $resolved = gethostbyname($rblhost);

            if ($resolved != $rblhost) {
                return true;
            }
        }
    }
    return false;
}

function ReverseIPOctets($inputip)
{
	$ipoc = explode(".",$inputip);
	return $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
}

?>

Script als Download: block_proxy.php

Das Script könnt ihr per Include laden und dann mit dem folgenden Befehl scharf machen:

include_once("block_proxy.php");
if (block_proxys() == true AND $block_proxy_attemts == true) { exit("Proxys are not allowed to connect to this page, please connect directly"); }

Das Script schaut sich zum Einen die Header des Requests an und erkennen die teil-anonymen Proxy’s. Die öffentlichen high-anonym Proxys werden über die RBL Liste blockiert. TOR Proxys werden über eine Tor-Exit-Node DNS Abfrage erkennt.

Somit sind die grössten Möglichkeiten einen Proxy zu nutzen gescheitert. Sicherlich kann der User dann immer noch anonym auf die Seite kommen, dies ist aber nur wenigen Usern möglich und auch mit sehr grossem Aufwand verbunden.

Kiddie-Spamer/Flooder wenden sich dann schnell anderen lohnenden Zielen zu. Das Script kann natürlich auch gezielt bei Userinteraktionsseiten eingebaut werden.

Auch nutze ich gelegentlich das Script im nicht-blockierenden Modus, um einfach eine Übersicht zu erhalten wie viele Personen überhaupt ein Proxy nutzen für ihr tägliches surfen. Genau dies ist auch der Nachteil des Scripts, denn es gibt viele Firmen und ISP, welche ein Proxy dazwischen schalten ohne diesen auf High-Anonym zu betreiben. Solche werden dann bei aktiver Blockierung rigoros weg gefiltert.

About Stefan

avatar
Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf. Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

PHP Trojaner (Teil 4: Codierte Uploader Infektion)

~2 Min. LesezeitNicht jeder PHP Trojaner kann auf den ersten Blick identifiziert werden, was der …

PHP Trojaner (Teil 3: Spamsender Infektion)

~1 Min. LesezeitSpam ist ein grosses Problem der heutigen Zeit, doch wer verschickt Spam und …

11 Kommentare

  1. avatar

    Dein letzter Satz hört sich ja schon so an, als ob es etwas böses wäre den (Firmen-)Proxy nicht auf ‚High-Anonym‘ (wie Du es nennst) zu setzen. Sicher gibt es einige Gründe die Übermittlung der ‚HTTP_X_FORWARDED_FOR‘- Mopeds aus zuschalten, aber es gibt auch Gründe dafür. Die betroffenen User werden von Dir jetzt ja ‚kriminalisiert‘?!
    Andererseits ist es nicht sehr schwer einen Server mit ’nph-proxy.cgi‘-Script aufzusetzen oder zu finden und dann darüber zu nerven. Die wiederum blockst Du nicht.
    Allerdings die Nummer mit der RBL Liste und den TOR Proxys ist eine gute Idee, sehe ich mir bestimmt mal an. – Danke.

  2. avatar

    Nein, kriminalisieren tue ich diese komplett nicht. Es macht absolut Sinn gewisse Header zu senden. High-Anonym Proxy’s sind eigentlich schlecht für das Internet, weil sie genau für solche Zwecke benutzt werden können. Auch ich lasse z.B. bei meinem der X-forwarded-for Header drin. Da soll Jeder wissen wer im Hintergrund des Proxys sitzt.
    Nur halt das Firmen welche dies nicht tun, auch vom Script blockiert werden.

    Das Script lässt sich logischerweise anpassen, das wen der x-Forwarded-for drin ist, der Proxy zugelassen wird. Mein Ziel war nun halt, Blockierung jedes Proxys.

  3. avatar

    Hallo,
    da verschiedene meiner Seite in letzter Zeit unter von TOR-Exit-Notes angegriffen wurden(Versuche mit SQL-Injection, Aufruf von vermuteten Setup-Skripten etc.), hat mir dein Skript schonmal geholfen.
    Ich habe es gerade selbst mit TOR probiert, es funktioniert.
    Danke.
    Was ich allerdings nicht verstehe ist, warum z.B. bei anonymouse.org und ähnliche Web-proxies nicht geblockt werden. Woran liegt das?
    Ich würde dein Skript gerne in ein WordPress-Plugin einbauen. Wäre das ok? Natürlich wird dein Name erwähnt.

  4. avatar

    Mein Script blockiert Proxys von tor 100%ig, da tor eine Möglichkeit liefert diese sauber zu blockieren.

    Die anderen Proxys kann es blockieren, wenn man sie erkennt. Sicherlich gibt es einige Verbesserungen, dazu müsste ich aber konkrete Beispiele haben die gehen, dann kann ich dies implementieren.

    Das Script darfst du verwenden, Disclaimer lässt dies zu, solange für nicht kommerzielle Zwecke und eine Erwähnung vorkommt. Also das OK hast du sehr gerne.

    Schick mir Beispiele die durchgekommen sind und ich helfe dir gerne diese abzuwehren. Ein Tipp noch, Fail2Ban könnte auch noch helfen: http://blog.murawski.ch/2010/11/debian-fail2ban-howto/

  5. avatar

    Ich habe deinen Script eingebaut, nur dabei ist mir aufgefallen, das die meißten Proxys die ich dann testweise ausprobiert habe eben nicht blockiert werden :/
    Die Webseite und das Forum bei der ich mit arbeite werden derzeit von Spammern tyrannisiert, die Shoutbox können wir schon nicht mehr anzeigen, weil wenn wir nur kurz nicht hinsehen ist sie wieder zugespammt, und die Kommentarfunktion hatte ich bis jetzt deshalb auch abgeschaltet, immerhin kann man bei der Shoutbox ja IPs bannen, genauso wie im Forum, auf der seite allerdings habe ich das noch nicht, aber wenn diese Spammer dort jetzt zugreifen können, obwohl dein Script drin ist, dann weiß ich langsam wirklich nicht was ich noch machen soll.
    Ich habe sogar das FOrum extrem für alle Gäste einschrenken müssen.

    Hier die Seite und das Forum:
    http://sentosoretenshi.de/
    http://anime-manga-rpg-forum.de/

    Wenn du mir irgendwie helfen könntest wäre das toll, ich weiß nämlich grad nciht mehr was wir noch machen können.

  6. avatar

    Mein Script oben blockiert nur Proxys die auf der RBL Liste sind und TOR Proxys.

    Drohnen (verngesteuerte PCs per Trojaner) werden nicht erkannt und Proxys die sehr oft die IP wechseln auch nicht. Da empfehlt es sich die RBL Liste zu erweitern (nicht nur http.dnsbl.sorbs.net & misc.dnsbl.sorbs.net). Problematisch wird es dann, wenn man dyn Ranges blockiert.

    Eine Methode die ich nicht vorgestellt habe, ist, man kann auch per PHP zu jedem Besucher seiner IP eine Verbindung zu ihm zurück aufmachen und die 3 wichtigsten Proxy Ports scannen. Ist einer offen = blockieren.

    Dies blockiert extrem zuverlässig, aber macht dem Server Arbeit.

    Wenn du die IP Ranges kennst, kannst du ein .htaccess File erstellen im Webroot deiner Seite und da etwa den Inhalt rein:

    order deny,allow
    deny from 147.124.1.2 #Spammer 1
    deny from .ru #Russland blockieren
    allow from all

    Apache2 macht dann automatisch die Sperre. Nichts installieren und deine Webseite muss nichts können dafür 😉

  7. avatar

    Dein Script klingt sehr interessant. Und das was du zuletzt erwähnt hast mit dem Verbindungsrückaufbau würde mich interessieren. Hast Du da konkrete Beispiel? Oder kannst Du helfen etwas umzusetzen?

    LG, Chris

  8. avatar

    Schau dir dazu mal fsocksopen() bei PHP an. Verbindung zu der Client IP aufzubauen und 3-4 Ports (auf welchen meist ein Proxy läuft zurückzuconnecten, bei Erfolg = Proxy ist sehr einfach gelöst.

    Gruss

  9. avatar

    Hallo Wir betreiben ein Forum und möchten keine Proxy-User drin haben.

    Das Script habe ich soweit eingefügt, jedoch funktioniert es nicht.

    Wo kann der Fehler liegen?

  10. avatar

    Schau mal nach, ob Schreibrechte auf dem Logfile vorhanden sind.
    Funktionieren noch die Blacklists welche ich im Jahr 2010 eingefügt habe?

    Vermutlich wirst du die neue Blacklistsserver angeben müssen 😉

    Gruss Stefan

  11. avatar

    Na sowas ist toll nur die Frage wo kommt was hinein wäre toll wenn man dies dazu schreibt.

    Danke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.