Trackbackspam mit PHP verhindern

Im September des letzten Jahres habe ich bereits einmal über eine Möglichkeit zum erkennen von Trackbackspam geschrieben. Diese Funktion habe ich nun noch etwas verfeinert und einen zusätzlichen Check eingebaut.

Damit ein Trackback nicht als Spam identifiziert wird, müssen zwei Bedingungen erfüllt sein.

Zum einen muss die Seite die den Trackback sendet, einen Link auf meine Seite haben. Klingt logisch, denn warum sonst sollte man einen Trackback versenden. Das kommt immer mit einem Link zusammen. Nur durch dieses Kriterium filtert man schon einen Grossteil von dem Spamnachrichten, denn die Webseiten der Spamer haben selten einen Backlink auf die eigene Seite.

Die andere Bedingung ist, dass die IP Adresse der Webseite, die angegeben wird, dieselbe sein muss wie die des Servers der den Trackback sendet. Erhalte ich also einen Trackback mit der URL test.ch muss der Trackback auch von dem Server gesendet werden, auf dem test.ch liegt. Mal abgesehen von NAT.

Um zu überprüfen, ob die Webseite einen Link auf die eigene Seite gesetzt hat, muss man den Inhalt der anderen Webseite auslesen und diesen nach einem Link absuchen. In dieser Funktion suche ich nur nach dem String t-error.ch und das erkennt auch die meisten Spamnachrichten.
Der Vergleich der IP-Adresse ist auch relativ simpel. Mit der Funktion getHostbyName() löst man die IP Adresse der URL auf und die IP Adresse des Servers der den Trackback sendet, kann man man mit $_SERVER['REMOTE_ADDR'] auslesen.

Und so sieht die Funktion dann aus.
<?
function trackbackSpamCheck($url)
{
    
// trackback prinzipiell als spam definieren
    
$spam=TRUE;
    
    
// URL in einzelteile zerlegen
    
$url=parse_url(trim(addSlashes($url)));
    
    
// verbindung zum host auf port 80 herstellen
    
$fp=fSockOpen($url['host'],80,$errno,$errstr,30);
    
    
// ueberpruefen, ob die verbindung steht
    
if($fp)
    {
        
// pfad zur zieldatei auslesen
        
$path=$url['path'];
        if(isSet(
$url['query']))
        {
            
$path.="?".$url['query'];
        }

        
// wenn der pfad leer ist '/' verwenden
        
if($path=="")
        {
            
$path="/";
        }

        
// get request an den server senden
        
$req ="GET ".$path." HTTP/1.0\r\n";
        
$req.="Host: ".$url['host']."\r\n\r\n";
        
fPuts($fp,$req);

        
// http headers auslesen
        
while(!feof($fp))
        {
            
$data=fgets($fp,1024);
            if(
trim($data)=="")
            {
                break;
            }
        }

        
// daten auslesen
        
while(!feof($fp))
        {
            
$data=fgets($fp,1024);
            
            
// ueberpruefen, ob t-error.ch darin vorkommt
            // dies kann man noch verfeinern,
            // in dem man nach einem link sucht
            
if(eregi("t-error.ch",$data))
            {
                
$spam=FALSE;
                break;
            }
        }
        
        
// verbindung zum server trennne
        
fclose($fp);
    }

    
// ip adresse des hosts auslesen,
    // auf dem die im trackback angegebene
    // webseite liegt
    
$ip=@getHostByName($url['host']);

    
// ueberpruefen, ob die ip adresse
    // aufgeloest werden konnte.
    // trackback sonst als spam definieren
    
if($ip==$url['host'])
    {
        
$spam=TRUE;
    }
    else
    {
        
// ip adresse der webseite
        // mit der ip des hosts,
        // welcher den trackback gesendet
        // hat vergleichen
        
if($_SERVER['REMOTE_ADDR']!=$ip)
        {
            
$spam=TRUE;
        }
    }
    
    
// spam status zurueckgeben    
    
return $spam;
}
?>

Adblock-Liste

Adblock kennt inzwischen ja eigentlich jeder Firefox User.
Ich möchte hier mal meine Filter-Liste veröffentlichen, vieleicht kann sie jemand anders auch brauchen, oder hat Ergänzungen dazu.
[Adblock]
*/ad/*
*/ads/*
*/banner/*
*adbutler*
*adition.com*
*adition.net*
*adserv*
*adtech*
*annonce*
*banners*
*bs*.gmx.*
*doubleclick*
*ebayrelevancead*
*fastclick*
*fastklick*
*gator*
*googlesyndication*
*indieclick.com*
*mediavantage.de*
*tradedoubler.com*
*tribalfusion.com*
http://ad.adition.net/*
http://adimg.uimserv.net/*
http://image.adition.net/*
Download hier.

Importieren kann man die Listen in den Preferences unter Adblock-Optionen -> Filter importieren