⬅ Zurück zur Übersicht

SPAM protection methods N° 3: Timing ist wiedermal alles

david am Freitag, 25.05.2018 - 01:22:14
⬅ Zurück zur Übersicht

Auch bei der Seitennavigation kann man den Geschwindigkeitsunterschied zwischen Bot und realem Nutzer relativ gut ausnutzen. Während ein Nutzer normalerweise ein paar Sekunden auf der Seite bleibt, bis er alle Informationen aufgenommen und verarbeitet hat (und möglicherweise sogar ein Formular ausgefüllt hat), macht ein Bot das ganze im Bruchteil einer Sekunde. Das können wir auf mehrere Arten ausnutzen.

1. Wann ist es ein Bot, wann ein Mensch

Grundsätzlich bietet sich hier an, mit Durchschnittszeiten zu arbeiten. Eine 404 Fehlerseite wird vermutlich nur maximal 3 Sekunden angeschaut, während ein langer Text (wie beispielsweise Unternehmensneuigkeiten, About Us oder gar das Impressum) vermutlich deutlich länger durchgelesen wird. Wenn jetzt mehrmals nach weniger als 3 Sekunden eine Seitennavigation stattfindet, kann man davon ausgehen dass irgendwas nicht stimmt!
Alternativ können wir aber auch die Zeit messen, welche der Nutzer auf der Seite verbringt. Wenn immer etwa nach der gleichen Zeit eine Seitennavigation stattfindet (auch wenn es länger als 3 Sekunden ist) egal wie lang das Dokument ist, stimmt vermutlich auch etwas nicht. Wer navigiert denn auch immer nach der gleichen Zeit, unabhängig vom Seiteninhalt?
Top – Level Developer würden hier auch in Betracht ziehen, individuell für jede Seite die Verweildauer aller Nutzer zu messen und einen Durchschnittswert zu bilden. Jeder Nutzer, der hier mehr als X% abweicht, kann als Bot angesehen werden. Aber Achtung: Sollte sich jemand verklicken und die Seite direkt wieder verlassen oder auf der Seite bemerken, dass der Inhalt doch nicht dem entspricht was er erwartet hat, navigiert er womöglich schneller als der Durchschnitt weiter und wird daher fälschlicherweise als Bot angesehen. Eventuell müsste man das Konzpt dann noch ein bisschen weiter denken 🙂

2. PHP: Variante Nummero Uno

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

So, was passiert hier? Auf jeder Seite wird obiges Skript aufgerufen. Wenn der Unterschied zwischen dem aktuellen Unix-Timestamp und dem Unix – Timestmap des letzten Seitenaufrufs weniger als 5 Sekunden beträgt (der Nutzer in weniger als 5 Sekunden also zur nächsten Seite navigiert hat), dann wird der Wert der Sessionvariable „quicknavigation“ (es handelt sich schließlich um eine … na? Quick Navigation!) um eins erhöht (oder alternativ auf 1 festgelegt, wenn bisher nicht definiert).
Beträgt er mehr als 5 Sekunden, aber weniger als 10 Sekunden, dann passiert erstmal nichts – da ich in diesem Zeitraum davon ausgehe, dass es entweder ein Bot ist oder ein Mensch (vielleicht berechnet der Bot irgendwas, braucht Zeit um die gefundene Mailadresse zu speichern oder ähnliches…). Findet allerdings erst nach 10 oder mehr Sekunden die nächste Navigation statt, dann setzen wir den „Quicknavigation – Wert“ wieder auf 0, denn wir können davon ausgehen, dass, selbst wenn jetzt zwar ein paar mal schnell navigiert wurde und Quicknavigation einen höheren Wert hat, kein Bot 10 Sekunden braucht um eine Seite zu analysieren. Ergo handelt es sich wohl trotz der vorherigen schnellen Navigation um einen Menschen, und wir setzen den Wert Quicknaviation wieder auf 0 (Ich weiß, auch Bots können Timeouts gesetzt habe um genau solche Sicherheitsmaßnahmen zu überwinden. Aber aus Erfahrung geht es bei Bots hauptsächlich darum, schnell an Informationen zu kommen bzw. schnell die Kommentarfunktion zu suchen um Spam zu verbreiten, wobei der Grundsatz „Masse statt Klasse“ gilt. Ich habe mich daher für einen kompletten Reset der Daten nach 10 Sekunden entschieden).
Wenn der Nutzer/Bot jetzt 8x am Stück innerhalb weniger als 5 Sekunden navigiert hat, dann geben wir die Botmeldung aus (und fragen eventuell nach einem Captcha?).

3. PHP: Variante Nummero Due

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--?php &lt;br ?--> 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]) &lt; 5
&amp;&amp; abs($diff[1] - $diff[2]) &lt; 5
&amp;&amp; abs($diff[2] - $diff[3]) &lt; 5
&amp;&amp; abs($diff[3] - $diff[4]) &lt; 5 &amp;&amp;
abs($diff[4] - $diff[5]) &lt; 5) $_SESSION['block'] = true; ?&gt;

Oh what the … was passiert hier?
Wir messen die Durchschnittszeit der letzten Navigationen. Wenn 5x innerhalb weniger als 5 Sekunden die Seite gewechselt wurde, setzten wir die Sessionvariable ‚block‘ auf „true“ und sperren den Nutzer von allen weiteren Seiten aus. Auch hier wäre es angebracht, eventuell erstmal mit einem Captcha anzufangen als den Nutzer direkt auszuschließen.

4. Fazit

Wir sollten uns bei solchen Maßnahmen immer vor Augen halten, dass wir zwar potenzielle Bots erkennen können, aber false-positives natürlich niemals ausgeschlossen werden können. Daher sollte grundsätzlich niemals ein Nutzer komplett von der Seite ausgesperrt werden, nur weil er sich vom Navigationstiming wie ei Bot verhält. Wir können aber Anhand des Navigationstimings einen ersten Verdacht äußern und durch z.B. eine Captchaabfrage geeignete Maßnahmen treffen, um unsere Seite effektiv vor Bots zu schützen.
Ihr habt weitere Ideen oder Anregungen zu dieser Vorgehensweise? Schreibt sie in die Kommentare welche nach Prüfung durch mich freigeschaltet werden.

Kommentar schreiben

Kommentare