Zruck zum Blog, du Zniachtl
Mai 2018·4 Min. zum LesnVo da KI übersetzt

SPAM-Protection-Methoden Nr. 3: Timing is wiedamoi olles

#php

A bei da Seitnnavigation kann ma den Geschwindigkeitsunterschied zwischn Bot und echtem Nutzer relativ guat ausnutzn. Während a Nutzer normalerweise a poar Sekunden auf da Seitn bleibt, bis er olle Informationen aufgnommen und valorbeit hot (und möglicherweise sogar a Formular ausgfüllt hot), mocht a Bot des Ganze im Bruchteil von ana Sekunde. Des kinnan mia auf mehrere Arten ausnutzn.

1. Wann is es a Bot, wann a Mensch

Grundsätzlich bietet si do an, mit Durchschnittszeiten zu orbeitn. A 404-Fehlerseitn wird vermutlich nur maximal 3 Sekunden ongschaut, während a langer Text (wia zum Beispiel Unternehmensneuigkeiten, About Us oda gor des Impressum) vermutlich deutlich länger durchglesn wird. Wenn jetzt mehrmals noch weniger ois 3 Sekunden a Seitnnavigation stattfindet, kann ma davon ausgehn, dass irgendwos ned stimmt! Alternativ kinnan mia aber a die Zeit messn, de da Nutzer auf da Seitn verbringt. Wenn imma ungefähr noch da söbn Zeit a Seitnnavigation stattfindet (a wenn's länger ois 3 Sekunden is), egal wia long des Dokument is, stimmt vermutlich a wos ned. Wer navigiert denn a imma noch da gleichen Zeit, unabhängig vom Seiteninhalt? Top-Level-Entwickler würdn do a in Betracht ziagn, individuell für jede Seitn die Verweildauer von olle Nutzer zu messn und an Durchschnittswert zu bilden. Jeder Nutzer, der do mehr ois X % abweicht, kann ois Bot ongsehn wern. Aber Achtung: Soitat si wer valickn und die Seitn direkt wieda valossn oda auf da Seitn merkn, dass da Inhalt doch ned dem entspricht, wos er erwartet hot, navigiert er womöglich schneller weiter ois da Durchschnitt und wird daher fälschlicherweise ois Bot ongsehn. Eventuell müsst ma des Konzept dann no a bissl weiterdenken :-)

2. PHP: Variante Nummero Uno

<?php
session_start();
if (time() - $_SESSION['last_navigation'] < 5) if (!isset($_SESSION['quicknavigation']) ? $_SESSION['quicknavigation'] = 1 : $_SESSION['quicknavigation']++);
if (time() - $_SESSION['last_navigation'] > 10) $_SESSION['quicknavigation'] = 0;
if (isset($_SESSION['quicknavigation']) && $_SESSION['quicknavigation'] == 8) die("Du bist höchstwahrscheinlich ein Bot!");
$_SESSION['last_navigation'] = time();
?>

So, wos passiert do? Auf jeder Seitn wird des obige Skript aufgrufn. Wenn da Unterschied zwischn dem aktuellen Unix-Timestamp und dem Unix-Timestamp vom letztn Seitnaufruf weniger ois 5 Sekunden betrogt (da Nutzer in weniger ois 5 Sekunden also zur nächsten Seitn navigiert hot), dann wird da Wert von da Sessionvariable "quicknavigation" (es handelt si schließlich um a ... na? Quick Navigation!) um oans erhöht (oda alternativ auf 1 festgelegt, wenn bisher ned definiert). Betrogt er mehr ois 5 Sekunden, aber weniger ois 10 Sekunden, dann passiert erstmoi nix - weil i in dem Zeitraum davon ausgeh, dass es entweder a Bot is oda a Mensch (vielleicht berechnet da Bot irgendwos, braucht Zeit, um die gfundene Mailadresse zu speichern oda Ähnliches...). Findet aber erst noch 10 oda mehr Sekunden die nächste Navigation statt, dann setzn mia den "Quicknavigation-Wert" wieda auf 0, denn mia kinnan davon ausgehn, dass, selbst wenn jetzt zwoar a poar Moi schnö navigiert wurde und Quicknavigation an höheren Wert hot, koa Bot 10 Sekunden braucht, um a Seitn zu analysiern. Ergo handelt's si wohl trotz da vorherigen schnellen Navigation um an Menschen, und mia setzn den Wert Quicknavigation wieda auf 0 (I woaß, a Bots kinnan Timeouts gsetzt hom, um genau solche Sicherheitsmaßnahmen zu überwinden. Aber aus Erfahrung geht's bei Bots hauptsächlich drum, schnö an Informationen zu kemman bzw. schnö die Kommentarfunktion zu suachn, um Spam zu verbreitn, wobei da Grundsatz "Masse statt Klasse" gilt. I hob mi daher für an kompletten Reset von de Daten noch 10 Sekunden entschieden). Wenn da Nutzer/Bot jetzt 8x am Stück innerhoib vo weniger ois 5 Sekunden navigiert hot, dann gebn mia die Botmeldung aus (und fragn eventuell noch am Captcha?).

3. PHP: Variante Nummero Due

<?php
session_start();
if ($_SESSION['block'] === true) die('BOT');
if (count($_SESSION['navigation']) == 5) array_shift($_SESSION['navigation']);
if ($_SERVER['SCRIPT_FILENAME'] != $_SESSION['last_called_script']){
  $_SESSION['navigation'][] = time();
  $diff[] = $_SESSION['navigation'][1] - $_SESSION['navigation'][0];
  $diff[] = $_SESSION['navigation'][2] - $_SESSION['navigation'][1];
  $diff[] = $_SESSION['navigation'][3] - $_SESSION['navigation'][2];
  $diff[] = $_SESSION['navigation'][4] - $_SESSION['navigation'][3];
  $diff[] = $_SESSION['navigation'][5] - $_SESSION['navigation'][4];
  if (abs($diff[0] - $diff[1]) < 5 && abs($diff[1] - $diff[2]) < 5 && abs($diff[2] - $diff[3]) < 5 && abs($diff[3] - $diff[4]) < 5 && abs($diff[4] - $diff[5]) < 5) $_SESSION['block'] = true;
}
?>

Oh what the ... wos passiert do? Mia messn die Durchschnittszeit von de letztn Navigationen. Wenn 5x innerhoib vo weniger ois 5 Sekunden die Seitn gwechselt wurde, setzn mia die Sessionvariable 'block' auf "true" und sperrn den Nutzer von allen weiteren Seitn aus. A do wär's angebracht, eventuell erstmoi mit am Captcha anzufangen, ois den Nutzer direkt auszuschließn.

4. Fazit

Mia soitn uns bei sölchen Maßnahmen imma vor Augen hoitn, dass mia zwoar potenzielle Bots erkennen kinnan, aber False-Positives natürlich nie ausgschlossn wern kinnan. Drum soit grundsätzlich nie a Nutzer komplett von da Seitn ausgsperrt wern, nur weil er si vom Navigationstiming wia a Bot valhoit. Mia kinnan aber anhand vom Navigationstiming an ersten Verdacht äußern und durch z. B. a Captchaabfrage geeignete Maßnahmen treffn, um unsere Seitn effektiv vor Bots zu schützn. Ihr hobts weitere Ideen oda Anregungen zu dera Vorgehensweise? Schreibts sie in die Kommentare, de noch Prüfung durch mi freigschoitn wern.

NeicherSPAM-Protection-Methoden Nr. 2: Timing is ollesElterHTTP Range Request mit PHP valorbeitn