Timing-Angriffe sind eine Methode zur Erkennung von Bots, die auf der Analyse der AusfĂŒhrungszeiten von Aktionen im Browser basiert. Moderne Anti-Fraud-Systeme von Facebook, Google, TikTok und anderen Plattformen analysieren nicht nur, was Sie tun, sondern auch, wie schnell Sie es tun. Zu schnelle Klicks, sofortiges Laden von Seiten, das Fehlen natĂŒrlicher Pausen â all dies verrĂ€t die Automatisierung. In diesem Artikel werden wir technische Schutzmethoden gegen Timing-Angriffe fĂŒr Entwickler untersuchen, die mit Selenium, Puppeteer und Anti-Detect-Browsern arbeiten.
Was sind Timing-Angriffe und wie funktionieren sie
Ein Timing-Angriff ist eine Methode zur Erkennung von Automatisierung, die auf der Messung der Zeitintervalle zwischen den Aktionen eines Benutzers basiert. Anti-Fraud-Systeme sammeln Telemetrie: wie viel Zeit vom Laden der Seite bis zum ersten Klick vergangen ist, wie schnell der Benutzer scrollt, ob es Pausen beim AusfĂŒllen von Formularen gibt. Diese Daten werden mit Verhaltensmodellen von echten Menschen verglichen.
Die wichtigsten zeitlichen Metriken, die von Schutzsystemen analysiert werden:
- Time to First Interaction (TTFI) â die Zeit vom Laden der Seite bis zur ersten Aktion (Klick, Scrollen, Texteingabe). Bots handeln normalerweise sofort nach dem Laden des DOM, Menschen â nach 0,5-3 Sekunden.
- Klick-Zeitmuster â Intervalle zwischen Klicks. Automatisierte Skripte klicken oft mit gleicher Frequenz (z.B. genau alle 2 Sekunden), Menschen â chaotisch.
- Konsistenz der Tippgeschwindigkeit â Geschwindigkeit der Texteingabe. Bots geben Text sofort oder mit konstanten Verzögerungen zwischen den Zeichen ein, Menschen â mit variabler Geschwindigkeit und Pausen.
- Mausbewegungsgeschwindigkeit â Geschwindigkeit der Cursorbewegung. Selenium teleportiert den Cursor standardmĂ€Ăig sofort an den gewĂŒnschten Punkt, Menschen bewegen die Maus mit Beschleunigung und Verzögerung.
- Scrollverhalten â Muster beim Scrollen der Seite. Bots scrollen oft genau um eine feste Anzahl von Pixeln, Menschen â unregelmĂ€Ăig, mit Stopps.
Die Erkennungssysteme verwenden maschinelles Lernen zur Analyse dieser Metriken. Sie erstellen ein Verhaltensprofil und berechnen die Wahrscheinlichkeit, dass der Benutzer ein Bot ist. Wenn die zeitlichen Muster zu perfekt oder zu schnell sind â ist das ein rotes Signal.
Wichtig: Timing-Angriffe sind besonders effektiv gegen Massenautomatisierung. Wenn Sie 100 Browser mit den gleichen zeitlichen Mustern ausfĂŒhren, wird das Anti-Fraud-System sie leicht aufgrund statistischer Anomalien erkennen.
Methoden zur Erkennung von Automatisierung durch zeitliche Muster
Moderne Anti-Fraud-Systeme verwenden mehrere Schichten der Analyse zeitlicher Merkmale. Lassen Sie uns spezifische Techniken betrachten, die Facebook, Google, Cloudflare und andere Plattformen anwenden.
1. Analyse der Performance API
Browser bieten die Performance API, die detaillierte Telemetrie zum Laden von Seiten sammelt. Anti-Fraud-Systeme analysieren:
// Beispiel fĂŒr Performance API-Daten
performance.timing = {
navigationStart: 1234567890000,
domLoading: 1234567890150, // +150ms
domInteractive: 1234567890300, // +300ms
domComplete: 1234567890500, // +500ms
loadEventEnd: 1234567890600 // +600ms
}
// VerdĂ€chtige Muster fĂŒr Bots:
// - Zu schnelles Laden (domComplete < 200ms)
// - Perfekt gleichmĂ€Ăige Intervalle zwischen Ereignissen
// - Keine Verzögerungen beim Laden externer Ressourcen
Headless-Browser (insbesondere Ă€ltere Versionen von Puppeteer und Selenium) zeigen oft anormal schnelle Werte fĂŒr navigationStart und domLoading, da sie Bilder, Schriftarten und andere Ressourcen nicht so laden wie ein normaler Browser.
2. Ereignis-Zeit-Analyse
JavaScript-Tracker verfolgen die Zeitstempel aller Ereignisse (Klicks, Mausbewegungen, Tasteneingaben) und analysieren Muster:
// Beispiel fĂŒr das Sammeln von Telemetrieereignissen
const events = [];
document.addEventListener('click', (e) => {
events.push({
type: 'click',
timestamp: performance.now(),
x: e.clientX,
y: e.clientY
});
});
// Analyse verdÀchtiger Muster:
// - Klicks erfolgen genau alle N Millisekunden
// - Keine Mikrobewegungen der Maus vor dem Klick
// - Der erste Klick erfolgt sofort nach dem Laden der Seite
3. Tastenanschlag-Dynamik
Beim AusfĂŒllen von Formularen analysieren Anti-Fraud-Systeme die Dynamik der TastenanschlĂ€ge â ein einzigartiger biometrischer Indikator jeder Person:
- Dwell time â die Zeit, in der eine Taste gedrĂŒckt wird (von keydown bis keyup). Bei Menschen variiert sie zwischen 50 und 200 ms, bei Bots ist sie konstant.
- Flight time â die Zeit zwischen dem Loslassen einer Taste und dem DrĂŒcken der nĂ€chsten. Bei Menschen betrĂ€gt sie zwischen 100 und 500 ms mit Variationen, bei Bots ist sie eine feste Verzögerung.
- Tipp-Rhythmus â das allgemeine Tempo des Tippens. Menschen machen Pausen bei Satzzeichen, korrigieren Fehler, Bots nicht.
Beispiel fĂŒr die Erkennung: Wenn Sie element.send_keys("text") in Selenium verwenden, wird der gesamte Text in 1-2 Millisekunden eingegeben â das verrĂ€t sofort die Automatisierung.
Nachahmung menschlicher Verzögerungen im Code
Die erste Schutzebene gegen Timing-Angriffe besteht darin, Verzögerungen zwischen den Aktionen hinzuzufĂŒgen. Es ist jedoch wichtig, nicht einfach time.sleep(2) einzufĂŒgen, sondern ein natĂŒrliches Verhalten zu simulieren.
Grundlegende Nachahmung von Verzögerungen in Python (Selenium)
import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
def human_delay(min_sec=0.5, max_sec=2.0):
"""ZufÀllige Verzögerung, die einen Menschen imitiert"""
delay = random.uniform(min_sec, max_sec)
time.sleep(delay)
driver = webdriver.Chrome()
driver.get("https://example.com")
# Verzögerung vor der ersten Aktion (der Mensch liest die Seite)
human_delay(1.5, 4.0)
# Klick auf das Element
button = driver.find_element(By.ID, "submit-btn")
button.click()
# Verzögerung vor der nÀchsten Aktion
human_delay(0.8, 2.5)
Fortgeschrittene Nachahmung mit normaler Verteilung
Eine gleichmĂ€Ăige Verteilung (uniform) sieht unnatĂŒrlich aus. Menschliche Verzögerungen folgen einer Normalverteilung mit AusreiĂern:
import numpy as np
def realistic_delay(mean=1.5, std_dev=0.5, min_val=0.3, max_val=5.0):
"""
Verzögerung mit normaler Verteilung
mean: durchschnittliche Verzögerungszeit
std_dev: Standardabweichung
min_val, max_val: Grenzen (um extreme Werte zu vermeiden)
"""
delay = np.random.normal(mean, std_dev)
delay = max(min_val, min(max_val, delay)) # Begrenzen des Bereichs
time.sleep(delay)
return delay
# Verwendung
realistic_delay(mean=2.0, std_dev=0.7) # Durchschnitt 2 Sek., aber mit Variationen
Kontextuelle Verzögerungen
Verschiedene Aktionen erfordern unterschiedliche Zeiten. Erstellen Sie Verzögerungsprofile fĂŒr verschiedene Szenarien:
class HumanBehavior:
"""Verzögerungsprofile fĂŒr verschiedene Arten von Aktionen"""
@staticmethod
def page_load_delay():
"""Verzögerung nach dem Laden der Seite (Inhalt lesen)"""
return realistic_delay(mean=2.5, std_dev=1.0, min_val=1.0, max_val=6.0)
@staticmethod
def before_click():
"""Verzögerung vor dem Klick (Element mit den Augen suchen)"""
return realistic_delay(mean=0.8, std_dev=0.3, min_val=0.3, max_val=2.0)
@staticmethod
def before_typing():
"""Verzögerung vor dem Beginn der Texteingabe"""
return realistic_delay(mean=1.2, std_dev=0.5, min_val=0.5, max_val=3.0)
@staticmethod
def between_form_fields():
"""Verzögerung zwischen den Formularfeldern"""
return realistic_delay(mean=0.6, std_dev=0.2, min_val=0.2, max_val=1.5)
# Verwendung im Skript
driver.get("https://example.com/login")
HumanBehavior.page_load_delay()
username_field = driver.find_element(By.ID, "username")
HumanBehavior.before_typing()
# ... Eingabe des Benutzernamens ...
HumanBehavior.between_form_fields()
password_field = driver.find_element(By.ID, "password")
HumanBehavior.before_typing()
# ... Eingabe des Passworts ...
Randomisierung der AusfĂŒhrungszeiten von Aktionen
Gleiche Verzögerungen zwischen den Aktionen sind eine statistische Anomalie. Wenn Sie 100 Instanzen des Skripts ausfĂŒhren und alle genau 2,5 Sekunden nach dem Laden auf die SchaltflĂ€che klicken â wird dies leicht erkannt. Eine Randomisierung auf mehreren Ebenen ist erforderlich.
1. Randomisierung der Reihenfolge der Aktionen
FĂŒgen Sie VariabilitĂ€t in die Reihenfolge der Aktionen ein. Zum Beispiel scrollen Sie manchmal die Seite, bevor Sie das Formular ausfĂŒllen, manchmal nicht:
def fill_form_naturally(driver):
# 30% Wahrscheinlichkeit, die Seite vor dem AusfĂŒllen zu scrollen
if random.random() < 0.3:
driver.execute_script("window.scrollBy(0, 200)")
human_delay(0.5, 1.5)
# 20% Wahrscheinlichkeit, an eine zufÀllige Stelle zu klicken (Nachahmung des Lesens)
if random.random() < 0.2:
body = driver.find_element(By.TAG_NAME, "body")
body.click()
human_delay(0.3, 0.8)
# Hauptaktion â AusfĂŒllen des Formulars
username_field = driver.find_element(By.ID, "username")
type_like_human(username_field, "myusername")
2. Variable Tippgeschwindigkeit
Anstelle einer sofortigen Texteingabe simulieren Sie die Eingabe Zeichen fĂŒr Zeichen mit variabler Geschwindigkeit:
def type_like_human(element, text):
"""Texteingabe mit Nachahmung der menschlichen Tippgeschwindigkeit"""
for char in text:
element.send_keys(char)
# Grundverzögerung zwischen den Zeichen
base_delay = random.uniform(0.05, 0.15)
# ZusÀtzliche Pausen bei Leerzeichen und Satzzeichen
if char in [' ', '.', ',', '!', '?']:
base_delay += random.uniform(0.1, 0.3)
# ZufĂ€llige "Nachdenklichkeit" (5% Wahrscheinlichkeit fĂŒr lange Pausen)
if random.random() < 0.05:
base_delay += random.uniform(0.5, 1.5)
time.sleep(base_delay)
# Manchmal machen wir einen Tippfehler und korrigieren ihn (10% Wahrscheinlichkeit)
if random.random() < 0.1:
time.sleep(random.uniform(0.2, 0.5))
element.send_keys(Keys.BACKSPACE)
time.sleep(random.uniform(0.1, 0.3))
element.send_keys(text[-1]) # Letztes Zeichen erneut eingeben
3. Puppeteer: langsame Texteingabe
In Puppeteer gibt es eine eingebaute Option delay fĂŒr die Methode type(), aber sie muss randomisiert werden:
// Grundlegende Verwendung (NICHT empfohlen â feste Verzögerung)
await page.type('#username', 'myusername', { delay: 100 });
// Richtiger Ansatz â Randomisierung fĂŒr jedes Zeichen
async function typeWithVariableSpeed(page, selector, text) {
await page.click(selector);
for (const char of text) {
await page.keyboard.type(char);
// ZufÀllige Verzögerung von 50 bis 150 ms
let delay = Math.random() * 100 + 50;
// ZusÀtzliche Pause bei Leerzeichen
if (char === ' ') {
delay += Math.random() * 200 + 100;
}
// ZufÀllige lange Pausen (5% Wahrscheinlichkeit)
if (Math.random() < 0.05) {
delay += Math.random() * 1000 + 500;
}
await page.waitForTimeout(delay);
}
}
// Verwendung
await typeWithVariableSpeed(page, '#username', 'myusername');
NatĂŒrliches Mausbewegung und Scrollgeschwindigkeit
Selenium und Puppeteer bewegen den Mauszeiger standardmĂ€Ăig nicht â sie teleportieren ihn sofort an den gewĂŒnschten Punkt und klicken. Dies ist eines der offensichtlichsten Anzeichen fĂŒr Automatisierung. Um menschliche Mausbewegungen zu simulieren, sind spezielle Bibliotheken erforderlich.
Bibliothek pyautogui fĂŒr sanfte Mausbewegungen
Die Bibliothek pyautogui ermöglicht es, den Cursor entlang einer Bézier-Kurve mit Beschleunigung und Verzögerung zu bewegen:
import pyautogui
from selenium.webdriver.common.action_chains import ActionChains
def move_mouse_naturally(driver, element):
"""Sanfte Bewegung der Maus zum Element mit Nachahmung eines Menschen"""
# Holen Sie sich die Koordinaten des Elements
location = element.location
size = element.size
# Zielpunkt (Mitte des Elements + kleine ZufÀlligkeit)
target_x = location['x'] + size['width'] / 2 + random.randint(-5, 5)
target_y = location['y'] + size['height'] / 2 + random.randint(-5, 5)
# Sanfte Bewegung mit variabler Geschwindigkeit
# duration â Bewegungszeit (0,5-1,5 Sek. fĂŒr Realismus)
duration = random.uniform(0.5, 1.5)
# tweening â Beschleunigungsfunktion (easeInOutQuad imitiert menschliche Bewegung)
pyautogui.moveTo(target_x, target_y, duration=duration, tween=pyautogui.easeInOutQuad)
# Kleine Pause vor dem Klick (der Mensch klickt nicht sofort)
time.sleep(random.uniform(0.05, 0.15))
# Klick
element.click()
Wichtig: Diese Methode funktioniert nur, wenn Selenium ein echtes Browserfenster steuert (nicht headless). FĂŒr den Headless-Modus ist die Mausbewegung nutzlos, da Anti-Fraud-Systeme den Cursor nicht sehen.
Puppeteer: Nachahmung der Mausbewegung
In Puppeteer kann die Bibliothek ghost-cursor fĂŒr realistische Cursorbewegungen verwendet werden:
// Installation: npm install ghost-cursor
const { createCursor } = require("ghost-cursor");
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
const cursor = createCursor(page);
await page.goto("https://example.com");
// Sanfte Bewegung zum Element und Klick
const button = await page.$("#submit-btn");
await cursor.click(button); // Der Cursor bewegt sich entlang einer Bézier-Kurve!
// Alternativ â Bewegung zu Koordinaten
await cursor.move("#username"); // Wir bewegen den Cursor einfach ohne Klick
await page.waitForTimeout(300);
await cursor.click(); // Wir klicken an der aktuellen Position
})();
Nachahmung des Scrollens
Menschen scrollen nicht die Seite genau um 500 Pixel auf einmal. Das Scrollen sollte unregelmĂ€Ăig sein, mit Pausen und manchmal RĂŒckscrollen:
def scroll_like_human(driver, target_position=None):
"""
Nachahmung menschlichen Scrollens
target_position: Zielposition in Pixeln (wenn None â scrollen wir bis zum Ende)
"""
current_position = driver.execute_script("return window.pageYOffset;")
if target_position is None:
# Scrollen bis zum Ende der Seite
target_position = driver.execute_script("return document.body.scrollHeight;")
while current_position < target_position:
# ZufÀlliger Scrollschritt (100-400 Pixel)
scroll_step = random.randint(100, 400)
current_position += scroll_step
# Scrollen
driver.execute_script(f"window.scrollTo(0, {current_position});")
# Pause zwischen den Scrolls (der Mensch liest den Inhalt)
time.sleep(random.uniform(0.3, 1.2))
# Manchmal scrollen wir ein wenig zurĂŒck (10% Wahrscheinlichkeit)
if random.random() < 0.1:
back_scroll = random.randint(50, 150)
current_position -= back_scroll
driver.execute_script(f"window.scrollTo(0, {current_position});")
time.sleep(random.uniform(0.2, 0.6))
# Verwendung
scroll_like_human(driver, target_position=2000) # Scrollen bis 2000px
Ladezeiten von Seiten und AJAX-Anfragen
Anti-Fraud-Systeme analysieren nicht nur die Aktionen des Benutzers, sondern auch die Ladecharakteristika von Seiten. Headless-Browser laden oft anormal schnell, da sie Bilder nicht laden, einige Skripte nicht ausfĂŒhren und CSS nicht rendern.
Problem: Zu schnelles Laden
Vergleichen Sie die typischen Werte der Performance API fĂŒr einen normalen Browser und headless:
| Metrik | Normaler Browser | Headless (verdÀchtig) |
|---|---|---|
| domContentLoaded | 800-2000 ms | 50-200 ms |
| loadEventEnd | 2000-5000 ms | 100-500 ms |
| Anzahl der geladenen Ressourcen | 50-200 (Bilder, CSS, JS) | 5-20 (nur kritische) |
Lösung: KĂŒnstliche Ladeverzögerung
FĂŒgen Sie eine kĂŒnstliche Verzögerung nach dem Laden der Seite hinzu, damit die Metriken natĂŒrlicher aussehen:
def load_page_naturally(driver, url):
"""Laden der Seite mit Nachahmung einer natĂŒrlichen Ladezeit"""
start_time = time.time()
driver.get(url)
# Warten auf das vollstÀndige Laden des DOM
WebDriverWait(driver, 10).until(
lambda d: d.execute_script("return document.readyState") == "complete"
)
# Berechnen der tatsÀchlichen Ladezeit
actual_load_time = time.time() - start_time
# Wenn das Laden zu schnell war (< 1 Sek.), fĂŒgen Sie eine Verzögerung hinzu
if actual_load_time < 1.0:
additional_delay = random.uniform(1.0, 2.5) - actual_load_time
time.sleep(additional_delay)
# ZusĂ€tzliche Verzögerung fĂŒr "Seitenlesen"
time.sleep(random.uniform(0.5, 2.0))
# Verwendung
load_page_naturally(driver, "https://example.com")
Warten auf AJAX-Anfragen
Moderne Websites laden Inhalte asynchron ĂŒber AJAX. Wenn Ihr Skript beginnt zu handeln, bevor alle AJAX-Anfragen abgeschlossen sind â ist das verdĂ€chtig. Verwenden Sie explizite Wartezeiten:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def wait_for_ajax(driver, timeout=10):
"""Warten auf den Abschluss aller AJAX-Anfragen (jQuery)"""
WebDriverWait(driver, timeout).until(
lambda d: d.execute_script("return jQuery.active == 0")
)
# FĂŒr Websites ohne jQuery â Warten auf ein bestimmtes Element
def wait_for_dynamic_content(driver, selector, timeout=10):
"""Warten auf das Erscheinen eines dynamisch geladenen Elements"""
WebDriverWait(driver, timeout).until(
EC.presence_of_element_located((By.CSS_SELECTOR, selector))
)
# ZusÀtzliche Verzögerung nach dem Erscheinen des Elements
time.sleep(random.uniform(0.3, 0.8))
Einstellungen zum Schutz in Anti-Detect-Browsern
Wenn Sie mit Arbitrage, Multi-Accounting oder anderen Aufgaben arbeiten, bei denen AnonymitĂ€t entscheidend ist, verwenden Sie Anti-Detect-Browser: Dolphin Anty, AdsPower, Multilogin, GoLogin. Sie verfĂŒgen ĂŒber integrierte Schutzmechanismen gegen Timing-Angriffe, mĂŒssen jedoch richtig konfiguriert werden.
Dolphin Anty: Einstellung der menschlichen Eingabe
In Dolphin Anty gibt es die Funktion "Human Typing" â automatische Nachahmung der menschlichen Texteingabe. Einstellungen:
- Ăffnen Sie das Browserprofil â Registerkarte "Automation"
- Aktivieren Sie "Human Typing Emulation"
- Konfigurieren Sie die Parameter:
- Durchschnittliche Tippgeschwindigkeit: 150-250 Zeichen/Minute (realistische Geschwindigkeit)
- Variation: 30-50% (Schwankungen der Geschwindigkeit zwischen den Zeichen)
- Pausen bei Satzzeichen: aktiviert (Pausen bei Satzzeichen)
- ZufÀllige Tippfehler: 2-5% (zufÀllige Tippfehler mit Korrektur)
Danach wird jede Texteingabe ĂŒber die API von Dolphin automatisch einen Menschen nachahmen.
AdsPower: Einstellung der Mausbewegung
AdsPower ermöglicht es, die Bewegungsmuster eines echten Benutzers aufzuzeichnen und wiederzugeben:
- Ăffnen Sie das Profil â "Erweiterte Einstellungen" â "Mausverhalten"
- WĂ€hlen Sie den Modus "Real User aufzeichnen":
- Ăffnen Sie den Browser im normalen Modus
- FĂŒhren Sie typische Aktionen aus (Klicks, Scrollen, Mausbewegungen)
- AdsPower wird die Bewegungsbahnen aufzeichnen
- Bei der Automatisierung ĂŒber die API wird AdsPower die aufgezeichneten Muster mit Variationen wiedergeben
Multilogin: Canvas Noise und WebGL Timing
Multilogin fĂŒgt Rauschen (noise) in Canvas- und WebGL-FingerabdrĂŒcke ein, was sich auf Timing-Angriffe auswirkt, die mit dem Rendering verbunden sind:
- Profil â "Fingerprint-Einstellungen" â "Canvas"
- Aktivieren Sie "Canvas Noise" (fĂŒgt Mikrozögerungen beim Rendern von Canvas hinzu)
- Aktivieren Sie "WebGL Metadata Masking" (maskiert GPU-Eigenschaften, die die Rendergeschwindigkeit beeinflussen)
Dies schĂŒtzt vor der Erkennung durch die Analyse der AusfĂŒhrungszeit von Canvas.toDataURL() und WebGL-Operationen.
Empfehlung: Wenn Sie mit Multi-Accounting auf Facebook, Instagram oder TikTok arbeiten, verwenden Sie unbedingt Anti-Detect-Browser in Kombination mit hochwertigen residential Proxys â das minimiert das Risiko von Chain-Bans und Erkennung durch IP.
Fortgeschrittene Techniken zur Umgehung der Timing-Erkennung
FĂŒr besonders geschĂŒtzte Plattformen (Google, Facebook, Bankwebsites) sind grundlegende Methoden möglicherweise nicht ausreichend. Lassen Sie uns fortgeschrittene Techniken betrachten.
1. Umgehung der Performance API
Sie können die Methoden der Performance API ĂŒberschreiben, um realistische Werte anstelle der tatsĂ€chlichen zurĂŒckzugeben:
// Skriptinjektion zur Umgehung von performance.now()
const script = `
(function() {
const originalNow = performance.now.bind(performance);
let offset = 0;
let lastValue = 0;
performance.now = function() {
const realValue = originalNow();
// FĂŒgen Sie zufĂ€lligen Rauschen zur Zeit hinzu
const noise = Math.random() * 2 - 1; // von -1 bis +1 ms
let fakeValue = realValue + offset + noise;
// GewĂ€hrleistung der Monotonie (Zeit lĂ€uft nicht zurĂŒck)
if (fakeValue <= lastValue) {
fakeValue = lastValue + 0.1;
}
lastValue = fakeValue;
return fakeValue;
};
})();
`;
// Puppeteer: Injektion beim Erstellen der Seite
await page.evaluateOnNewDocument(script);
Achtung: Diese Methode kann durch die ĂberprĂŒfung der IntegritĂ€t nativer Methoden erkannt werden. Verwenden Sie sie nur auf Websites ohne starken Schutz.
2. Drosselung von CPU und Netzwerk
Das Chrome DevTools-Protokoll ermöglicht es, CPU und Netzwerk kĂŒnstlich zu verlangsamen, damit die Ladezeiten natĂŒrlicher aussehen:
// Puppeteer: Verlangsamung der CPU um das Zweifache
const client = await page.target().createCDPSession();
await client.send('Emulation.setCPUThrottlingRate', { rate: 2 });
// Verlangsamung des Netzwerks (Emulation von 3G)
await page.emulateNetworkConditions({
offline: false,
downloadThroughput: 1.5 * 1024 * 1024 / 8, // 1.5 Mbps
uploadThroughput: 750 * 1024 / 8, // 750 Kbps
latency: 40 // 40ms Verzögerung
});
Dies erhöht die Ladezeiten von Seiten und die AusfĂŒhrung von JavaScript und macht das Profil Ă€hnlicher zu einem echten Benutzer mit durchschnittlicher Internetgeschwindigkeit.
3. Nachahmung von HintergrundaktivitÀten
Echte Benutzer bleiben nicht auf einem Tab â sie wechseln zwischen Tabs, minimieren Fenster, lassen sich ablenken. Imitieren Sie dies:
async function simulateTabSwitch(page) {
// Emulieren des Wechsels zu einem anderen Tab (Page Visibility API)
await page.evaluate(() => {
Object.defineProperty(document, 'hidden', {
get: () => true,
configurable: true
});
document.dispatchEvent(new Event('visibilitychange'));
});
// Pause (Benutzer sieht sich einen anderen Tab an)
await page.waitForTimeout(Math.random() * 3000 + 2000);
// ZurĂŒck zum Tab wechseln
await page.evaluate(() => {
Object.defineProperty(document, 'hidden', {
get: () => false,
configurable: true
});
document.dispatchEvent(new Event('visibilitychange'));
});
}
// Verwendung: zufÀllig wÀhrend der Arbeit "ablenken"
if (Math.random() < 0.15) { // 15% Wahrscheinlichkeit
await simulateTabSwitch(page);
}
4. Verwendung realer User Timing Marks
Einige Websites erstellen ihre eigenen Zeitmarken ĂŒber die User Timing API. FĂŒgen Sie realistische Marken hinzu:
// Erstellen realistischer Timing-Marken
await page.evaluate(() => {
// Nachahmung des "Denkens" des Benutzers vor einer Aktion
performance.mark('user-started-reading');
setTimeout(() => {
performance.mark('user-found-button');
performance.measure('reading-time', 'user-started-reading', 'user-found-button');
}, Math.random() * 2000 + 1000);
});
5. Rotation von Proxys zur Verringerung der statistischen Korrelation
Selbst wenn jede Instanz Ihres Skripts randomisierte Verzögerungen hat, können Anti-Fraud-Systeme Korrelationen erkennen, wenn alle Anfragen von einer IP kommen. Verwenden Sie die Rotation von Proxys:
- FĂŒr Parsing- und Massenaufgaben: Datacenter-Proxys mit automatischer Rotation alle 5-10 Minuten
- FĂŒr die Arbeit mit sozialen Netzwerken und Werbung: residential Proxys mit Sitzungsbindung (sticky sessions)
- FĂŒr mobile Plattformen (Instagram, TikTok): Mobile Proxys mit Rotation nach Timer oder auf Anfrage
Die Rotation von IPs verringert die Wahrscheinlichkeit, dass das Anti-Fraud-System genĂŒgend Daten fĂŒr die statistische Analyse Ihrer Timing-Muster sammeln kann.
Fazit
Timing-Angriffe sind eine komplexe Methode zur Erkennung von Automatisierung, die einen umfassenden Schutzansatz erfordert. Die wichtigsten Erkenntnisse:
- Verwenden Sie keine festen Verzögerungen â randomisieren Sie immer die Zeit zwischen den Aktionen unter Verwendung einer Normalverteilung
- Nachahmung kontextueller Verzögerungen â verschiedene Aktionen erfordern unterschiedliche Zeiten (Seiten lesen â auf einen Button klicken)
- FĂŒgen Sie VariabilitĂ€t in die Reihenfolge der Aktionen ein â zufĂ€llige Scrolls, Klicks, Tabwechsel
- Verwenden Sie sanfte Mausbewegungen â Bibliotheken wie ghost-cursor (Puppeteer) oder pyautogui (Selenium)
- Nachahmung der natĂŒrlichen Tippgeschwindigkeit â zeichenweise Eingabe mit Pausen bei Satzzeichen
- Konfigurieren Sie Anti-Detect-Browser â Dolphin Anty, AdsPower und Multilogin haben integrierte Schutzmechanismen gegen Timing-Angriffe
- Kombinieren Sie mit hochwertigen Proxys â die Rotation von IPs verringert die Möglichkeit statistischer Analysen
Denken Sie daran: Es gibt keinen perfekten Schutz. Anti-Fraud-Systeme entwickeln sich stĂ€ndig weiter und fĂŒgen neue Erkennungsmethoden hinzu. Ihre Aufgabe ist es, das Verhalten des Skripts so nah wie möglich an einem echten Benutzer zu halten und die Umgehungsmethoden regelmĂ€Ăig zu aktualisieren.
Wenn Sie mit der Automatisierung von Browsern fĂŒr Parsing, Tests oder andere Aufgaben arbeiten, empfehlen wir die Verwendung von residential Proxys â sie bieten das höchste MaĂ an AnonymitĂ€t und minimieren das Risiko der Erkennung durch die IP-Adresse. FĂŒr mobile Plattformen sind mobile Proxys besser geeignet, die echte Benutzer von Mobilfunkanbietern nachahmen.