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;
}
?>

Trackbackspam verhindern

In letzter Zeit hatte ich, wie schonmal schonmal berichtet, vermehrt Trackbackspam. Für das Problem mit dem Kommentarspam habe ich eine gute Lösung gefunden. Seit der Einführung der Matheaufgabe, hatte ich keinen Spamkommentar mehr. Bei den Trackbacks ist das ja nicht so einfach, aber es gibt trotzdem eine recht zuverlässige Lösung.
Wenn ich von einer Seite einen Trackback erhalte, dann sollte auf dieser Seite auch ein Link auf meine Seite sein, oder sie sollte zumindest erwähnt werden. Und genau das überprüft diese Funktion.
Nun habe ich eine kleine PHP Funktiongeschrieben, welche überprüft ob auf der fremden Seite meine URL Vorkommt. So reicht eine Überprüfung des Strings t-error.ch schon. Ich muss nicht mal überprüfen, ob es ein Link ist, denn die Trackbackspammer erwähnen auf ihren Seiten meine Seite ja kaum. Die Funktion überprüft die Seite in der Variable $url und gibt die Variable $spam zurück. Relativ simpel und effektiv. Bisher wurde noch kein Trackbackspam durchgelassen.
<?
function trackbackSpamCheck($url)
{
    
// Spamvariable
    
$spam=1;

    
// die url aufsplitten
    
$parsed=parse_url(trim(addSlashes($url)));

    
// einen pfad angeben wenn noetig
    
if(!isSet($parsed['path']))
    {
        
$parsed['path']="/";
    }

    
// den querystring anfuegen wenn noetig
    
$path=$parsed['path'];
    if(isSet(
$parsed['query']))
    {
        
$path.="?".$parsed['query'];
    }

    
// zum host verbinden
    
$fp=fSockOpen($parsed['host'],80,$errno,$errstr,30);
    if(
$fp)
    {
        
// GET request senden
        
fPuts($fp,"GET ".$path." HTTP/1.0\r\n");
        
fPuts($fp,"Host: ".$parsed['host']."\r\n\r\n");

        
// Den Quelltext auslesen
        
while(!fEof($fp))
        {
            
// auf t-error.ch pruefen
            
if(eregi("t-error.ch",fgets($fp,1024)))
            {
                
// wenn vorhanden $spam auf 0 setzen und abbrechen
                
$spam=0;
                break;
            }
        }

        
// verbindung trennen
        
fclose($fp);
    }
    
    return 
$spam
}
?>

Vermehrt Trackback-Spam

In letzter Zeit wird mein Blog vermehrt von Trackbackspam heimgesucht. Das Ziel sind zwei verschiedene Beiträge in diesem Blog, die Nachrichten auch immer etwa dieselben. Der Link verwiest zu einem Forum, wo man auf eine "Pharmacy" Seite umgeleitet wird. Momentan sind es nur um die fünf Trackbacks pro Tag und ich kann die auch Problemlos löschen. Allerdings wird es ja doch recht nervig. Vor allem, wenn in Zukunft immer mehr kommen sollten. Und das Sperren von Trackbacks bei diesen Beiträgen ist ja auch keine langfristige Lösung.
Momentan fällt mir nur eine langfristige Lösung ein. Und zwar kann man die Seite nach einem Link zur eigenen Seite absuchen. Falls dieser nicht vorhanden ist kann man den Trackback moderieren lassen oder gleich ganz Löschen. Oder kennt jemand noch eine andere effektive Variante?

Von Spamfressern und Designänderungen

Ich bin entzückt. Seit dem Einbau des neuen Spamfilters am Samstag habe ich keinen einzigen Spambeitrag mehr erhalten. Und da bin ich froh. Der Counter, den ich gestern noch eingebaut habe zeigt schon 156 Versuche an. Und das in knapp 24 Stunden. Lieber in einem Counter als in meiner Datenbank. Auch Yoda versucht die Spamer auszutricksen. Wie erfolgreich er ist, wird sich sicher noch zeigen.
Zudem habe ich heute noch einwenig am Design geschraubt. Grundsätzlich bin ich damit ja zufrieden, nur das Logo gefällt mir nicht so. Ich habe nun mal einen Verlauf reingezogen und die Schrift verändert, aber wirklich zufrieden bin ich noch nicht. Leider bin ich grafisch nicht so begabt. Vieleicht werde ich aber noch Fotos in den Header aufnehmen, wenn ich mal Zeit habe.
Sollte jemand aber grafisch begat sein und genug Zeit haben, so sage ich bei einem guten Logo nicht nein :)

Rechnen gegen Commentspam

Wie schon angetönt habe ich genug vom Comment-Spam und war desshalb auf der Suche nach einer guten möglichkeit um den Bots das Leben zu erschweren.
Eine Möglichkeit wären die schon erwähnten Captchas gewesen, allerdings wäre dadurch die Accessability wieder eingeschränkt gewesen.
Nun muss jeder, der einen Kommentar schreiben will, eine Rechenaufgabe lösen. Nicht so der Wahnsinn. Ich denke, jeder hier sollte imstande sein zwei Zahlen zusammenzuzählen. :)
Nun gibt es also so kleine Rechnungen wie 5+8. Das sollte ja im machbaren Bereich liegen.

Zudem habe ich es endlich geschaft, dass die Angaben der Benutzer in einem Cookie gespeichert werden, damit man den Name, Mail usw. nicht immer wieder eingeben muss.

Ich werde die Spamgeschichte nun nuoch weiter verfolgen und hoffen, dass die Spambots noch nicht so gut rechnen können.

Tod dem Commentspam

http://images.t-error.ch/blog/107/captcha.jpgDa meine Seite schon seit längerem von Spambots heimgesucht wird, bin ich nun an einer (hoffentlich) endgültigen Lösung dran. Zumindest hoffe ich damit den Spam auf ein minimum reduzieren zu können.
Besonders beliebt sind momentan die Seiten Mail -> Blog und VISITOR.
Ich habe zwar schon eine kleine Blacklist drin, aber die bringt auch relativ wenig. Ich habe an eine Captcha als Lösung gedacht. Allerdings leidet die Accessibility wieder darunter. Wobei ich mich auch fragen muss, wie zugänglich diese Seite wirklich sein muss. Allerdings würde ich eine Variante bevorzugen, die ohne Bilder auskommt und trotzdem sicher ist.
Any ideas?