Too Cool for Internet Explorer

Impressum

Hier soll ein Script vorgestellt werden, welches unerwünschte Zugriffe auf eine Website zumindest teilweise verhindert. Bekannt sind solche Scripte unter dem Namen "Bot Trap" oder "Spider Trap" (Wikipedia). Ziel des Scriptes ist es, Bot's, Spider, Crawler etc. zu überführen, die sich nicht an die Regeln halten. Das ganze soll natürlich automatisch funktionieren und den Webmaster nicht belasten.
Der Einsatz diese Scriptes setzt Grundkenntnisse in PHP, der .htaccess - Datei und der robots.text voraus.

PHP - Bot Trap

Grundlagen

Wie geht man vor? Am besten mit der Methode, mit der man auch Bären fängt. Man stellt einen Honigtopf (honey pot) auf.
Im Einzelnen: Suchmaschinen setzen zur Informationsgewinnung Programme ein (robots, spider, crawler, harvester, bot), die das Web selbständig durchsuchen und alles an Informationen mitnehmen, was interessant erscheint. Nun möchte man ja manchmal nicht, das alles mitgenommen wird. Zur Wahrung der gegenseitigen Interessen von Suchmaschinenbetreibern und Webseitenbetreibern gibt es eine Datei mit dem Namen robots.txt. In dieser wird eingetragen, was die Suchmaschine nicht sehen soll. Das funktioniert bei seriösen Suchmaschinen ganz gut. Für die schwarzen Schafe ist es aber ein gefundenes Fressen. Sie grasen natürlich auch die gesperrten Verzeichnisse ab. Und in so ein gesperrtes Verzeichnis stellt man den Honigtopf. Wer in den tritt, klebt fest und gilt als überführt. Überführte Täter sperren man dann radikal aus. dazu braucht man die .htaccess - Datei. Da die IP' der "bösen Bot's" wechseln, werden sie nur für 1 Jahr gesperrt. Hier noch mal das Prinzip ordentlich erklärt.

Das Script kurz erläutert

Der Honigtopf

Das ist eine kleine PHP - Datei die mit allen möglichen "Nettigkeiten" gefüttert wird, so zum Beispiel nicht existierende Adressen und E-Mailadressen. Je nach Serverkonfiguration muss sie so benannt werden, dass sie beim Zugriff auf das Verzeichnis ausgeführt wird, also in den meisten Fällen "index.php". Die Minimalvariante würde so aussehen:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>Honigtopf</title>
</head>
<body>
  <p><?php include ("abt.php"); ?></p>
</body>
</html>

Entscheidend ist hier nur die Einbindung des PHP-Scripts per include. Den Rest kann man nach belieben ausgestalten.

Das PHP-Script

Die eigentliche "Arbeit" wird automatisch durch ein Script erledigt. Das soll folgende Aufgaben erfüllen:

Wichtigstes Hilfsmittel ist die .htaccess Datei im Root-Verzeichnis der Webseite. Um einer IP den Zugriff zur Webseite zu verweigern, ist folgendes einzutragen:

order allow,deny
# Beispiel-IP
deny from 127.0.0.1
allow from all

Das würde der IP-Adresse 127.0.0.1 den Zugriff auf die Website verwehren. Da die Eintragung automatisiert erfolgen soll, muss das Script "wissen", wo die Eintragung in der Datei zu machen ist. Dazu muss ein Tag eingefügt werden, das den zu beschreibenden Bereich markiert. Im Ergebnis sieht die .htaccess so aus:

order allow,deny
# beginn abt_control
# ende abt_control
allow from all

Alles was vor # beginn abt_control und hinter # ende abt_control steht, wird durch das Script nicht verändert. Innerhalb der Tags arbeitet das Script.
Das eigentliche Script besteht aus zwei Funktionen. Einmal eine Funktion zum Ermitteln der IP-Adresse des Aufrufers und zum anderen der Funktion zum Sperren einer IP.

<?php

// Routine zum Sperren aufrufen
echo set_deny();
exit;

function 
set_deny() {

  
// IP ermitteln durch Funktionsaufruf
  
$ip ip();

         ......

  
// bisher gesperrte IP's aus der Datei einlesen
  
$ipliste = @file('denyip.txt');

  
// Zeitstempel für monatliche automatische Bereinigung lesen
  
if(!is_file('stamp.txt')) {
    @
file_put_contents('stamp.txt',$tsm);
  }
  else {
    
$tsma = @file_get_contents('stamp.txt');
    
// wenn nötig IP - Einträge älter als 365 Tage bereinigen aus denyip.txt entfernen
    // diese Unterfunktion jedoch nur alle 30 Tage ausführen
    
if ($tsma < (time() - 3672000)) {

         .......

      foreach (
$ipliste as $key => $line) {
      
// hier alle IP's entfernen, die älter als 365 Tage gespeichert sind

         
.......

  }  }  }

  
// aktuelle IP der Liste hinzufügen
  
$ipliste[] = $ip '|' $t "\n";
  
// Textfile mit den gesperrten IP's schreiben
  
@file_put_contents('denyip.txt'$ipliste);

  
// jetzt die .htaccess aus dem root-Verzeichnis lesen
  
$htf file($_SERVER['DOCUMENT_ROOT'] . '/.htaccess');

         ......
  
// hier die .htaccess verarbeiten
         
......

  
// jetzt noch die "böse" IP's schreiben
  
foreach ($ipliste as $line) {
    
$l explode('|',$line);
    
$htaccess2[$i] = 'deny from ' $l[0] . "\n";
    
$i++;
  }
  
$out implode($htacess1) . implode($htaccess2) . implode($htaccess3);
  
// und abschließend eine geänderte Datei zurück schreiben
  
@file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/.htaccess'$out);

  return 
$s '<br>IP erfolgreich gesperrt.<br>';
}

// Funktion zum ermitteln der IP
function ip()  {
         ......
  return 
$ipaddr;
}
?>

Um das Ganze abzurunden, sollte der Zugriff auf die .txt - Datein nicht zugelassen und eine Fehlerseite eingerichtet werden. Auch ist es sinnvoll, dem Verzeichnis mit dem Script einen unverfänglichen Namen zu geben. Abschließen ist noch eine passende robots.txt zu erstellen.

Zusammenfassung

Das ganze Script mit allen notwendigen Dateien in Minimalform: phpabt.zip. Die Pfade, Namen usw. vor Verwendung bitte anpassen. Ebenso die Schreibrechte für die Dateien und Verzeichnisse
Hinweis: Haben sie sich aus Versehen nach dem Aufruf des Verzeichnisses mit dem Honigtopf selber ausgesperrt, müssen sie entweder ihre IP wechseln, 1 Jahr warten, oder den "Schaden" per FTP-Zugriff beheben und die Dateien .htaccess im Root-Verzeichnis wie auch die Datei denyip.txt von ihrer IP bereinigen.

Februar 2013