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