Alexander (HH): Spamschutz Gästebuch

Beitrag lesen

Moin Moin!

»» Der Zusammenhang mit Javascript ist mir noch nicht klar, kannst Du noch was dazu schreiben?

Wenn du serverseitig die Wert 2 und 3 ausgibst, und als Antwort auf diese "Challenge" 5 als Summe der beiden erwartest - dann kann der Browser diese per JavaScript selbst ausrechnen; ein Bot tut sich damit aber (etwas) schwerer.

Ja, und zwar aus exakt einem Grund: Die Simulation einer browsertypischen Javascript-Umgebung macht den Bot extrem anfällig.

Ich habe vor einiger Zeit mal die (im Nachhinein etwas abstrus wirkende) Idee umgesetzt, den selben Javascript-Code im Browser und auf dem Server zur Formularvalidierung einzusetzen. Letztlich habe ich für das Javascript ein paar ziemlich brutal einschränkende Regeln festgelegt, was den Umgang mit Formularelementen angeht, entsprechend wenig in der Server-JS-Umgebung nachgebaut, und dann in aller Regel den selben Validierungscode zweimal laufen lassen. Die eigentliche Implementation war nicht sonderlich schwierig, eine fertige Javascript-Engine vom Mozilla-Projekt ließ sich schnell an den Server anflanschen, und wegen der Einschränkungen für den Javascript-Code war auch nicht viel an Umgebung aufzubauen.

Mit Bots funktioniert das so aber gerade nicht. Der Bot, egal ob Spambot oder Suchbot, muß einen Browser so präzise wie möglich simulieren, um wirklich das selbe Ergebnis zu bekommen wie ein echter Browser. Ist die Umgebung von einem echten Browser zu unterscheiden, kann man Bots in Javascript erkennen und entsprechend handeln:

  
...  
<form name="f">  
<input name="bot" type="hidden" value="0">  
...  
</form>  
<script type="text/javascript">  
  function isBot()  
  {  
    return navigator.userAgent=='StupidBot/1.0';  /* blödes Beispiel! */  
  }  
  if (isBot()) {  
    document.f.bot.value="1";  
  }  
</script>  
...  

Und der Bot wird angreifbar. Erkennt das Javascript eine Spambot-Umgebung, kann das Javascript Rechenzeit und Speicherplatz verbrennen und so das Spammen verlangsamen:

  
  ...  
  if (isBot()) {  
    document.f.bot.value="1";  
    var i,j,k,a;  
    for (i=0; i<1000000; i++) {  
      a[i]=[];  
      for (j=0; j<1000000; k++) {  
        a[i][j]=[];  
        a[i][j][0]="Eat this!";  
        for (k=1; j<1000000; k++) {  
          a[i][j][k]=a[i][j][k-1]+a[i][j][k-1];  
        }  
      }  
    }  
  }  
  ...  

Setzt der Bot der JS-Umgebung ein Timeout, ist der Bot identifizierbar, ganz einfach über window.setTimeout() mit einer Zeitangabe über dem Limit. Versucht der Bot, das abzufangen, indem gesetzte Timeouts vorgezogen werden, kann man die vergangene Zeit mit window.setInterval() messen und bei drastischen Unterschieden ist der Bot wieder identifiziert. Außerdem gibt es noch das Date-Objekt, dessen Zeiten ebenfalls vom Bot gefälscht werden müßten. Das Javascript kann sich mit Hilfe des Servers (XMLHttpRequest, document.createElement("script")) die echte Uhrzeit holen und die vergangene Zeit auf dem Server mit der vergangenen Zeit in der Bot-Umgebung vergleichen. Ist der Unterschied drastisch genug, ist der Bot identifiziert. Funktioniert der Zugriff auf die externe Zeitquelle nicht, ist der Bot ebenfalls identifiziert.

Suchbots hätten ein anderes Problem, denn sie müßten DOM-Manipulationen erlauben (z.B. um eine rein Javascript-basierende Navigation überhaupt erst zu aktivieren):

  
  ...  
  if (isGoogleBot()) {  
    var b=document.getElementsByTagName('body')[0];  
    for (i=0; i<10000; i++) {  
      var a=document.createElement('a');  
      a.href="http://spam.example.com/spam/spam/spam.html";  
      a.appendChild(document.createTextNode("Eat more spam"));  
      b.appendChild(a);  
    }  
  }  
  ...  

Implementieren die Bots dann auch noch XMLHttpRequest, wird die Sache für Bot-Betreiber richtig widerlich. Mit XMLHttpRequest kann man, zusammen mit der Bot-Erkennung, die Bot-Maschinen sehr leicht mit sehr, sehr, sehr viel weiterem Müll beladen, ohne das irgendein normaler Browser darunter leiden müßte. Implementieren die Bots XMLHttpRequest nicht, obwohl der simulierte Browser XMLHttpRequest implementiert, ist der Bot zu erkennen. Emuliert der Bot einen aktiken Browser ohne XMLHttpRequest, fällt er erst recht auf.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".