Proxy blockieren per PHP
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.