Empfohlene Einstellungen – was Sie einschalten und was Sie in Ruhe lassen sollten
Die meisten Blockierungen, die wir auf eine Konfiguration zurückführen konnten, entstanden durch mehr Spoofing, nicht durch weniger. Diese Seite ist die Kurzfassung unserer Messungen: die Einstellungen, die sich lohnen, die, die mehr kosten, als sie bringen, und die Handvoll Probleme, die keine Einstellung lösen kann.
Hier anfangen
Wenn Sie sonst nichts auf dieser Seite lesen: Mit dieser Konfiguration sollten Sie beginnen. Sie variiert die Achsen, die sich gefahrlos variieren lassen, und lässt Rendering, TLS und die Browser-Version, wie sie sind.
import { launch } from "clearcote";
const browser = await launch({
lightStealth: true, // metadata identity only — rendering, TLS and version stay real
fingerprint: "account-42", // picks this identity's metadata bundle; keep it stable per identity
proxy: { server: "http://gateway:8080", username: "u", password: "p" },
geoip: true, // timezone + languages + the address WebRTC reports follow the proxy exit
humanize: true, // trusted native input; navigator.webdriver stays false
});In Python ist es dieselbe API in snake_case: light_stealth, fingerprint, geoip, humanize. Fügen Sie Achsen bewusst hinzu, eine nach der anderen, und nur, wenn Sie sagen können, was auf dem Host sie bestätigen wird. Mehrere Zeilen weiter unten – die eng gefassten r12-Schalter, humanize mit aufgezeichneten Bewegungen, socks5Udp, die Schalter für Drittanbieter-Cookies und Proxys – gelten für den lizenzierten Build (Kostenlos mit GitHub oder Pro). Der offene Build ignoriert sie: humanize fällt auf generierte Pfade zurück, und ein passwortgeschützter SOCKS5-Proxy verweigert die Verbindung.
Das Prinzip: Jeder Spoof ist eine Behauptung, die der Host belegen muss
Erkennung ist keine Suche nach ungewöhnlichen Werten. Sie ist eine Suche nach Widersprüchen – zwei Signalen, die nicht beide auf dieselbe Maschine zutreffen können. Ein gewöhnlicher Wert, den niemand gespooft hat, widerspricht nichts. Ein gespoofter Wert, hinter dem nichts steht, ist ein positives Signal, und zwar ein stärkeres als der Wert, den er verbergen sollte.
Die sinnvolle Frage vor dem Aktivieren einer Option lautet deshalb nicht „Ist dieser Wert plausibel?“, sondern „Was auf dieser Maschine lässt sich befragen, um ihn zu bestätigen, und wird die Antwort übereinstimmen?“ Bildschirmabmessungen werden gegen die Render-Surface geprüft. Ein GPU-String wird gegen die Pixel geprüft, die die GPU erzeugt. Ein behauptetes Betriebssystem wird gegen die Schriften geprüft, die die Plattform auflöst. Kann der Host die Behauptung nicht belegen, ist der ehrliche Wert der sicherere. Die Mechanik erklärt Wie Erkennung funktioniert.
Das sollten Sie tun
| Einstellung | Warum |
|---|---|
lightStealth: true | Setzt ausschließlich die Metadaten-Achsen, als kohärentes, aus dem Seed abgeleitetes Set – hardwareConcurrency, deviceMemory, colorDepth, devicePixelRatio, maxTouchPoints – über native Einzelwert-Schalter. Canvas-, WebGL- und Audio-Ausgabe, TLS und die echte Browser-Version bleiben, wie sie sind. Der Seed bestimmt nur, welches Bundle aus einer kleinen Auswahl eine Identität bekommt, und es gibt kein Rendering-Rauschen – Accounts auf derselben Maschine teilen sich also ihren Canvas-Hash. Prüfen Sie bei einem skalierten oder ungewöhnlichen Display im Audit, ob die vom Bundle gewählte Pixel-Ratio zu Ihrem Bildschirm passt. |
Ein stabiler fingerprint-Seed pro Identität | Gleicher Seed ⇒ gleiche Identität. Verwenden Sie ihn über die gesamte Lebensdauer des Accounts. Wer den Seed pro Request rotiert, lässt einen einzelnen eingeloggten Account jedes Mal von einer neuen Maschine kommen – ein weit lauteres Signal als jeder der rotierten Werte. Für mehrere Accounts auf einer Maschine, die sich keinen Canvas teilen dürfen, verwenden Sie die Seed-basierte Persona (ohne lightStealth), damit jeder Account sein eigenes Rendering-Rauschen erhält. |
geoip: true bei jedem Start | Zeitzone, Sprachen und die von WebRTC gemeldete Adresse folgen der Exit-IP – mit oder ohne Proxy (oder setzen Sie timezone und acceptLanguage selbst). Ohne beides nimmt das SDK New York und en-US an. Ein US-Residential-Exit, der Europe/Amsterdam meldet, lässt sich mit einer einzigen Zeile prüfen, und dieser Mismatch passiert leicht aus Versehen. Lässt sich die Region nicht auflösen, bricht der Start mit GeoipError ab, statt mit der Uhrzeit dieses Rechners zu starten – reparieren Sie den Proxy oder erhöhen Sie CLEARCOTE_GEOIP_TIMEOUT_SECONDS. |
humanize: true | Eingaben werden als vertrauenswürdige native Events auf menschlich geformten Cursorpfaden erzeugt (aufgezeichnete menschliche Bewegungen für Koordinatenklicks auf Pro, sonst generierte Pfade). Legen Sie kein eigenes Easing pro Schritt darüber – setzen Sie Wegpunkte und lassen Sie humanize interpolieren; selbstgebautes Easing erzeugt Bewegungsstatistiken, die normale Eingaben nie erzeugen. |
widevine: true mit Chrome-Brand | Die Standard-Persona gibt sich als Google Chrome aus, das die Widevine-DRM-Abfrage beantwortet. Ohne das CDM wird die Abfrage abgelehnt, und das kann jede Seite auslesen. Siehe Widevine & DRM. |
allowThirdPartyCookies: true, wenn ein eingebetteter Login oder eine Challenge nicht funktioniert | Die Basis ohne Google-Dienste (de-googled) blockiert Drittanbieter-Cookies, die normales Chrome zulässt. Eingebettete Frames für Anmeldung, Zahlung und Challenges, die darauf angewiesen sind, schlagen dann auf eine Weise fehl, wie es bei einem normalen Browser nicht passieren würde (lizenzierter Build, 152 r22+). |
| Ein persistenter Kontext pro Identität | Cookies, Site-Storage und der Cache gehören zur Identität. Eine Maschine, die die Site bei jedem einzelnen Besuch zum ersten Mal sieht, ist ein Muster für sich. |
| Headful unter Xvfb in Containern | Chrome im Headed-Modus vermeidet die verräterischen Merkmale des Headless-Modus von vornherein. Das offizielle Image läuft standardmäßig so. |
| Auf dem Betriebssystem laufen, das Sie vorgeben wollen | Die CSS2-Schlüsselwörter für Systemschriften beantwortet die Plattform unter dem Browser, nicht etwas, das die Seite oder der User-Agent steuert – sie überstehen also einen Wechsel des User-Agents. Wo das nicht geht, lassen Sie das Linux-Font-Bundle intakt – siehe unten. |
tlsProfile auf match-persona belassen | Der ClientHello folgt der Chrome-Version, die die Persona angibt, sodass Netzwerkschicht und UA übereinstimmen. Der Standard ist bereits richtig; kennen sollten Sie die Option nur, damit Sie sie nicht auf etwas festnageln, das Ihrer Brand-Version widerspricht. |
Das sollten Sie vermeiden
Jeder dieser Punkte ist etwas, bei dem wir gemessen haben, dass es schiefgeht – keine allgemeine Vorsichtsregel.
| Vermeiden | Was schiefgeht |
|---|---|
screen / avail* auf einem Host spoofen, dessen Display nicht dazu passt | Eine gefälschte Bildschirmgröße, die sich nicht mit dem echten Fenster und der Render-Surface in Einklang bringen lässt, löst bei den strengsten Anti-Bot-Systemen zuverlässig einen Block aus. Genau deshalb sind Bildschirmabmessungen nicht Teil von lightStealth und nur per Opt-in verfügbar. Wenn Sie sie setzen, dann das ganze kohärente Set – screenWidth, screenHeight, availWidth, availHeight – und lassen Sie eine plausible Lücke für die Taskleiste, statt avail gleich screen zu setzen. Im Headless-Modus wählt das SDK bereits einen plausiblen Bildschirm für Sie. |
| Eine GPU vorgeben auf einem Host, der in Software rendert | In einem Container oder einer Cloud-VM, die über WARP, SwiftShader oder llvmpipe rastert, beschreibt eine Persona, die eine Desktop-GPU vorgibt, Silizium, das die von der Seite auslesbaren Pixel nicht erzeugen kann. Ab dem lizenzierten Build 150 r12 (der offene Build ignoriert es) meldet gpuStringSpoof: false den echten WebGL-Vendor und -Renderer des Hosts und lässt alles andere unverändert – auf solcher Hardware oft der bessere Kompromiss. Beachten Sie die Einschränkung: WebGPU folgt weiterhin dem breiter gefassten disableGpuFingerprint, sodass mit dem eng gefassten Schalter allein navigator.gpu weiter die Persona beschreibt, während WebGL das echte Gerät meldet. |
Zu disableGpuFingerprint oder fingerprintNoise: false greifen, um eine einzige Sache zu ändern | Beides sind Bündel. disableGpuFingerprint verändert die Strings und die Parametertabelle und das readPixels-Farbling und die Unterdrückung von Persona-Feldern; fingerprintNoise: false schaltet Canvas-2D- und WebGL-Rauschen gemeinsam ab. Seit dem lizenzierten Build 150 r12 gibt es die eng gefassten Schalter: gpuStringSpoof: false nur für die Strings und canvasNoise: false nur für Canvas 2D. Beide eng gefassten Schalter haben einen Preis, den man kennen sollte: gpuStringSpoof: false verändert die WebGL-Strings, aber nicht navigator.gpu, sodass WebGL und WebGPU auf derselben Seite unterschiedliche Hersteller nennen – das ergibt einen guten Score, liest sich aber schlecht. Und canvasNoise: false zusammen mit einem Seed entfernt den Canvas pro Account vollständig. Nehmen Sie lieber das breit gefasste disableGpuFingerprint, das WebGL und WebGPU gemeinsam verändert. |
| Die Identität mitten in der Session wechseln | Wer Seed, Proxy-Exit oder Zeitzone während einer laufenden Session ändert, widerspricht dem bisherigen Verlauf dieser Session. Rotieren Sie zwischen Identitäten, nie innerhalb einer. |
| Eine Windows-Persona unter Linux mit entferntem Font-Bundle | Das Linux-Release bündelt metrisch kompatible Klone (Segoe UI→Selawik, Arial→Arimo, Times New Roman→Tinos, …), und das SDK bindet sie beim Start über FONTCONFIG_FILE ein. Entfernen Sie sie oder bauen Sie ein eigenes Image, das <binDir>/fonts/ weglässt, dann fallen alle Windows-Schriftfamilien, die die Persona angibt, auf eine einzige Standardschrift zusammen. Das ist ohne jede Referenzdaten sichtbar: Zwei Schriften, die Windows als verschiedene ausliefert, haben identische Maße. |
| Zusätzlich ein JS-Stealth-Plugin draufsetzen | Die Schalter von Clearcote sind in die Engine kompiliert. Ein Shim auf Skriptebene darüber bringt genau die sich selbst verratende Schicht zurück, die der Engine-Ansatz beseitigen soll – ein überschriebener Getter liefert als String seinen eigenen Quelltext, und ein einziges toString() liest ihn aus. |
| Eine mobile Persona auf einer Desktop-Engine, ohne Vorbehalt eingesetzt | platform: "android" verändert UA, Touch, Pointer-Typ, Bildschirm und Viewport, aber die Pixel kommen weiterhin von der Desktop-GPU (unter einem mobilen GPU-Namen), und die feine Seitengeometrie bleibt die eines Desktops. Es ist eine Best-Effort-Persona; betrachten Sie die Render-Surface als den Teil, den Sie noch selbst lösen müssen. |
Proxys
Der Proxy bestimmt das Ergebnis meist stärker als jedes Browser-Flag, und er wird am häufigsten einfach auf einem Standardwert belassen.
- Sticky Exits. Eine Exit-IP pro Identität, gehalten für die Dauer der Session. Eine Session, deren IP mittendrin wechselt, widerspricht sich selbst, egal wie gut der Fingerprint ist.
- Passen Sie die Geografie an die Persona an und lassen Sie dann
geoip: trueZeitzone und Sprachen ableiten, statt sie von Hand zu setzen. - Proxys mit Zugangsdaten übernimmt die Engine. Passwortabfragen von HTTP(S)-Proxys beantwortet der Browser selbst (lizenzierter Build 151 r19+, SDKs für Python & Node), sodass der Seiten-Cache aktiv bleibt und Requests nicht durch Interception markiert werden. SOCKS5 mit Passwort funktioniert auf dem lizenzierten Build direkt – übergeben Sie Benutzername und Passwort als separate Felder.
transparentProxy: true(152 r22+) verbirgt den Proxy in Request-Headern und im Verbindungs-Timing. - Verstehen Sie den WebRTC-Kompromiss. Chromium sendet Medien nie über einen HTTP- oder SOCKS-Proxy, Peer-Traffic liefe also sonst über Ihre echte Verbindung, wo ein Relay Ihre wahre Adresse lesen kann. Das SDK blockiert deshalb WebRTC-UDP, das am Proxy vorbeilaufen würde. Im offenen Build hebt
geoip/webrtcIpdiese Sperre auf; der lizenzierte Build behält sie bei. Kombinieren Sie das mitgeoip: true(oderwebrtcIp), damit die Seite trotzdem die Kandidaten sieht, die ein echtes Chrome erzeugt, mit der Adresse des Proxys; ohne das sammelt WebRTC gar nichts, und das sieht nach einer Blockade aus. Für funktionierende Peer-Verbindungen über einen SOCKS5-Proxy setzen Siesocks5Udp: true(lizenzierter Build; Ihr Anbieter muss UDP-Relaying erlauben), oder nutzen Sie einen vollständigen Tunnel (WireGuard/OpenVPN) ohne Browser-Proxy und übergeben Sie Ihre eigene--webrtc-ip-handling-policyinargs. Ansonsten behalten Sie die blockierende Standard-Policy bei.
Was keine Einstellung beheben kann
Einige der am häufigsten ausgelesenen Oberflächen bestimmt die Maschine, die Sie mieten, nicht der Browser, den Sie darauf betreiben.
| Oberfläche | Was der Host bestimmt |
|---|---|
| Rendering | Ein Host ohne GPU rastert in Software. Jedem Produkt dieser Kategorie bleibt dann nur, entweder Hardware vorzugeben, die nicht rendern kann, oder den Software-Rasterizer einzugestehen. Wenn gerenderte Pixel für Ihr Ziel wichtig sind, ist die Lösung ein Host mit GPU – oder die Canvas-Bridge, die die Arbeit an einen solchen weiterleitet. |
| Schriften | Eine Font-Liste ist durch das begrenzt, was der Host tatsächlich zeichnen kann – ab dem lizenzierten Build 150 r12 wird die kanonische Liste aus dreitausend echten Maschinen abgeleitet und trotzdem noch mit dem Host geschnitten, sodass einer Seite nie eine Schrift gemeldet wird, die sich nicht rendern lässt. Unter Linux verwendet das SDK das Font-Bundle, das mit dem Browser ausgeliefert wird, und ignoriert auf dem Host installierte Schriften; Pakete, die Sie in Ihr Image installieren, ändern also nichts daran, was Seiten sehen. Das Bundle des offenen Builds enthält keine CJK-Schriften, chinesischer, japanischer und koreanischer Text erscheint dort daher als fehlende Glyphen; das Bundle des lizenzierten Builds enthält sie. Unter Windows werden die eigenen Schriften des Hosts verwendet. Die Windows-Doppelgänger im Bundle machen die Breiten plausibel, aber eine Seite kann eine Schrift auch per local() über ihren Namen laden, und ein Doppelgänger trägt nicht den echten Namen: Mit einer Windows-Persona unter Linux ergaben die Messungen für Segoe UI und Georgia „installiert“, laden ließen sie sich aber nicht. |
| Text-Scaler | Jede Glyphe wird vom Font-Scaler des Betriebssystems skaliert: DirectWrite unter Windows, FreeType unter Linux. Keine Einstellung reicht bis dorthin. Erhöht man eine Schriftgröße schrittweise um 0,01 px, ändert sich die Textbreite unter Windows bei 99 % der Schritte und unter Linux bei 66 %, und ein Linux-Host, der sich als Windows ausgibt, liefert weiterhin 66 %. Wenn eine Seite Ihren Text genau ausliest, betreiben Sie den Browser auf dem Betriebssystem, das Sie vorgeben. Siehe den Font-Stack unter dem User-Agent. |
Prüfen statt annehmen
Jede Aussage auf dieser Seite lässt sich aus dem Browser heraus messen. Öffnen Sie mit Ihrer konfigurierten Session das Audit und lesen Sie die Zeilen, die es beanstandet – es ist dasselbe Tooling, mit dem wir die oben beschriebenen Probleme gefunden haben, und es zeigt Ihnen, gegen welche dieser Empfehlungen Ihr Setup derzeit verstößt.
Weiterlesen