www.fabiankeil.de/blog-surrogat/2006/01/26/firefox-user-agent-generator.html

Vorsicht Schlangenöl

Trotz anders lautenden Gerüchten sind weder Privoxy noch uagen.pl für Bugs in Online-Shops verantwortlich. Siehe dazu auch: Kleiner Realitätsabgleich für die OXID eSales GmbH.

uagen – Ein Firefox-User-Agent-Generator

uagen generiert einen zu einer beliebigen Firefox-Version passenden User-Agent und schreibt ihn in eine Privoxy-Action-Datei. Das lästige User-Agent-Ändern kann damit über cron automatisiert werden.

Bei der Verwendung von Tor ändert sich die vom Server wahrgenommene IP zwar etwa alle zehn Minuten, die von Privoxy gefälschte Browser-Kennung bleibt jedoch konstant und kann, je nach Wahl, zur pseudonymen Benutzer-Identifizierung benutzt werden.

Es gibt das Konzept, einfach den User-Agent von einer Firefox-Windows-Version zu nehmen, also den gleichen User-Agent wie tausend andere zu benutzen und in der Menge zu verschwinden. Damit erhöht man aber gleichzeitig die vom Server-Betreiber gemessene Zahl der Windows-Nutzer – schlecht für das Karma.

Besser ist es, den User-Agent regelmäßig zu ändern, bei der Wahl des vorgegebenen Betriebssystems das Karma aber nicht zu gefährden. Nebenbei sorgt man so für eine bessere User-Agent-Mischung im Server-Logfile, in der auch Nicht-Windows-Benutzer ohne manipuliertem User-Agent weniger auffallen – gut für das Karma.

Seit Version 0.3 kann uagen Privoxy auch dazu veranlassen, den Accept-Language-Header passend zum User-Agent zu fälschen, dazu wird zusätzlich die Privoxy-Aktion hide-accept-language benötigt (in Privoxy-Versionen ab 3.0.5 beta bereits enthalten).

Standardmäßig wird der Accept-Language-Header zwar nicht mit protokolliert, doch technisch ist es problemlos möglich und er kann auch ohne Protokollierung zur Erkennung von gefälschten User-Agents genutzt werden.

Inbetriebnahme

Eine Reihe von Parametern können uagen auf der Kommandozeile übergeben werden, --help zeigt welche:

fk@TP51 ~ $uagen --help
uagen 1.0.6
Copyright (C) 2006-2007 Fabian Keil <fk@fabiankeil.de> 
http://www.fabiankeil.de/sourcecode/uagen/

Options and their default values if there are any:
    [--action-file /etc/privoxy/user-agent.action]
    [--action-injection]
    [--browser-release-date 20070301]
    [--browser-revision 1.8.1.2]
    [--browser-version 2.0.0.2]
    [--clean-prefs-file]
    [--help]
    [--language-overwrite en-AU,en-GB,en-CA,en-NZ,en-US,en-ZW,es-ES,de-DE,de-AT,de-CH,fr-FR,sk-SK,nl-NL,no-NO,pl-PL]
    [--logfile /var/log/uagen.log]
    [--loop]
    [--no-action-file]
    [--no-hide-accept-language]
    [--no-logfile]
    [--prefs-file]
    [--quiet]
    [--silent]
    [--sleeping-time 5]
    [--version]
see "perldoc /home/fk/scripts/uagen.pl" for more information

Es gibt keine Pflicht-Optionen.

uagen kann von Hand aufgerufen werden:

fk@TP51 ~ $uagen --action-file /usr/jails/privoxy-jail/usr/local/etc/privoxy/user-agent.action --no-logfile
User Agent: Mozilla/5.0 (X11; U; NetBSD i386; de-DE; rv:1.8.0.6) Gecko/20060813 Firefox/1.5.0.6

Oder auch über cron:

fk@TP51 ~ $grep uagen /etc/crontab 
*/5     *       *       *       *       privoxy /usr/local/bin/uagen --action-file /usr/local/etc/privoxy/user-agent.action

Den User-Agent alle fünf Minuten zu ändern ist etwas übertrieben, verursacht anderseits aber auch keine irgendwie spürbare Last und erleichtert das Testen. Firefox ruft News-Feeds etwa einmal pro Stunde ab, falls man News-Feeds in Firefox nutzt, sollte das User-Agent-Wechsel-Intervall also darunter liegen.

Im Normallfall schreibt uagen die Action-Datei einmal und beendet sich anschließend, kann aber über die Option --loop in eine Schleife geschickt werden. Sinnvoll für kurze Tests, oder falls cron nicht verfügbar ist.

Momentan protokolliert uagen jeden Wechsel in /var/log/uagen.log, ebenfalls eine Testerleichterung, ansonsten recht überflüssig:

fk@TP51 ~ $tail -f /var/log/uagen.log 
uagen.pl (2006/01/25 19:20) User Agent: Mozilla/5.0 (X11; U; OpenBSD amd64; es-ES; rv:1.8) Gecko/20060118 Firefox/1.5
uagen.pl (2006/01/25 19:25) User Agent: Mozilla/5.0 (X11; U; NetBSD sparc64; en-GB; rv:1.8) Gecko/20060116 Firefox/1.5
uagen.pl (2006/01/26 11:30) User Agent: Mozilla/5.0 (X11; U; FreeBSD sparc64; es-ES; rv:1.8) Gecko/20051230 Firefox/1.5
uagen.pl (2006/01/26 11:35) User Agent: Mozilla/5.0 (X11; U; FreeBSD alpha; es-ES; rv:1.8) Gecko/20060102 Firefox/1.5
uagen.pl (2006/01/26 11:40) User Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; de-DE; rv:1.8) Gecko/20060110 Firefox/1.5
uagen.pl (2006/01/26 11:45) User Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; de-DE; rv:1.8) Gecko/20060108 Firefox/1.5
uagen.pl (2006/01/26 11:50) User Agent: Mozilla/5.0 (X11; U; Linux i586; es-ES; rv:1.8) Gecko/20051208 Firefox/1.5
uagen.pl (2006/01/26 11:55) User Agent: Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.8) Gecko/20051202 Firefox/1.5
uagen.pl (2006/01/26 12:00) User Agent: Mozilla/5.0 (X11; U; OpenBSD sparc64; de-DE; rv:1.8) Gecko/20051212 Firefox/1.5
uagen.pl (2006/01/26 12:05) User Agent: Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.8) Gecko/20060119 Firefox/1.5
uagen.pl (2006/01/26 12:10) User Agent: Mozilla/5.0 (Macintosh; U; 68K Mac OS X Mach-O; en-US; rv:1.8) Gecko/20051209 Firefox/1.5
uagen.pl (2006/01/26 12:15) User Agent: Mozilla/5.0 (Macintosh; U; 68K Mac OS X Mach-O; de-DE; rv:1.8) Gecko/20051218 Firefox/1.5
uagen.pl (2006/01/26 12:20) User Agent: Mozilla/5.0 (X11; U; Linux i586; de-DE; rv:1.8) Gecko/20051211 Firefox/1.5
uagen.pl (2006/01/26 12:25) User Agent: Mozilla/5.0 (X11; U; OpenBSD sparc64; de-DE; rv:1.8) Gecko/20051213 Firefox/1.5

Die Zeile:

/var/log/privoxy/privoxy.log privoxy:privoxy 640 30 100 * JB /var/run/privoxy.pid

in /etc/newsyslog.conf sorgt für regelmäßiges Rotieren der Log-Datei.

Privoxy-Anpassung

In Privoxys Konfigurations-Datei sollte die von uagen erzeugte Action-Datei hinter standard.action und vor user.action eingebunden werden, so können in user.action noch Ausnahmen festgelegt werden.

actionsfile standard   # Internal purpose, recommended
actionsfile default    # Main actions file
actionsfile user-agent # Random Firefox User agent
actionsfile user       # User customizations

uagen unter Windows

Unter Windows ist standardmäßig weder Perl noch cron verfügbar, beides kann aber über Cygwin nachinstalliert werden. Zwingend erforderlich ist für uagen nur ein Perl-Interpreter.

Bevor uagen getestet wird, sollte sichergestellt werden, dass der Perl-Interpreter korrekt installiert ist. Dazu öffnet man über Start/Ausführen/cmd die Windows-Kommandozeile, gibt dort den Pfad zum Perl-Interpreter ein und hängt den Parameter -e gefolgt von einem beliebigen Perl-Programm, zum Beispiel 'print "Test erfolgreich\n"', an.

Wurde Cygwin nach E:\Programme\cygwin installiert, könnte die Verfügbarkeit von Perl mit:

E:\Programme\cygwin\bin\perl.exe -e 'print "Test erfolgreich\n"'

getestet werden. Erscheint keine Fehlermeldung, steht der Nutzung von uagen nichts mehr im Wege, anstelle von -e 'print "Test erfolgreich\n"' werden dazu der volle Pfad zu uagen und anschließend die uagen-Parameter eingegeben. Zum Beispiel

E:\Programme\cygwin\bin\perl.exe E:\Programme\cygwin\bin\uagen.pl --action-file /cygdrive/e/Programme/privoxy-cvs/user-agent.action

Wichtig ist, dass Cygwins Perl-Interpreter Verzeichnisse korrekt mit / trennt, auf die Laufwerks-Metapher verzichtet und den Unterschied zwischen Groß- und Kleinbuchstaben kennt. Aus E:\Programme\privoxy-cvs/user-agent.action wird /cygdrive/e/Programme/privoxy-cvs/user-agent.action.

Falls keine Fehlermeldung erscheint, wurde die Action-Datei erfolgreich geschrieben und kann in Privoxy's Konfigurations-Datei ergänzt werden, anschließend sollte sie unter http://config.privoxy.org/show-status aufgelistet werden.

Falls noch eine ungepatchte Privoxy-Version 3.0.3 genutzt wird, beendet sich Privoxy mit einer Fehlermeldung, da die Aktion hide-accept-language nicht bekannt ist. Deren Generierung kann über die Option --no-hide-accept-language verhindert werden, die einfach an die anderen uagen-Parameter angehängt wird.

Die so erzeugte Action-Datei bereitet auch unter Privoxy 3.0.3 keine Probleme mehr, ein Privoxy-Update wäre natürlich die bessere Lösung, Privoxy 3.0.3 ist stark veraltet.

Wird zusätzlich der Parameter --loop genutzt, wird die Action-Datei alle fünf Minuten neu generiert, die Pause lässt sich über --sleeping-time X verändern.

Wenn die richtige uagen-Kommandozeile gefunden ist, kann man sie über eine Desktop-Verknüpfung klickbar machen. Dazu wird mir der rechten Maustaste auf den Desktop geklickt, und Neu/Verknüpfung ausgewählt.

Im daraufhin erscheinenden Assistenten wird nicht auf den Durchsuchen-Button geklickt, sondern die gesamte uagen-Kommandozeile als Speicherort des Elements einkopiert. Nach dem Druck auf den Weiter-Button kann eine beliebiger Name der Verknüpfung festgelegt werden, anschließend ist uagen direkt über den Desktop erreichbar.

Um uagen automatisch zu starten, kann die Verknüpfung zusätzlich in das Autostart-Verzeichnis (Start/Programme/Autostart) gezogen werden.

Den User-Agent direkt über general.useragent.override ändern

Seit Version 1.0.5 kann uagen die generierte Browser-Kennung auch in Mozilla-prefs-Dateien speichern. Dazu gibt es zwei neue Parameter: --prefs-file und --clean-prefs-file.

Über --prefs-file wird der Speicherort der prefs-Datei angegeben, bei Firefox auf Unix-Derivaten ist das im Normalfall ~/.mozilla/firefox/*.default/prefs.js, vorausgesetzt man möchte das Standard-Profil ändern. Über die zusätzliche Option --clean-prefs-file wird die Kennung wieder entfernt. Nötig ist das nur, wenn die Original-Kennung wieder hergestellt werden soll.

Direktes Editieren der prefs-Datei hat den Vorteil, auch bei verschlüsselten Verbindungen zu wirken, bei denen Privoxys Filter-Funktionen umgangen werden. Es hat den Nachteil, dass die Datei nur beim Start des Browsers interpretiert wird, spätere Änderungen werden ignoriert. --prefs-file ist also lediglich als Ergänzung gedacht, nicht aber als Ersatz für die Erzeugung der Privoxy-Action-Datei.

Am Kopf von Firefox' prefs-Datei wird ausdrücklich vor Veränderungen im laufenden Betrieb gewarnt.

Unter der Haube

Der User-Agent wird wie folgt zusammen gesetzt:

my $firefox_user_agent = sprintf "Mozilla/%s (%s; %s; %s; %s; %s) Gecko/%s Firefox/%s",
        $mozillaversion, $platform, $security, $os_or_cpu,
        $locale, $revision, $creation_time, $firefoxversion;

Die meisten Variablen-Namen kommen aus dem als Vorlage dienenden User-Agent-Dokument von mozilla.org, die User-Agent-Seite der Wikipedia wurde ebenfalls genutzt.

Die Werte für $mozillaversion, $security, $revision und $firefoxversion sind konstant, die restlichen Werte werden pseudo-zufällig gewählt. $os_or_cpu setzt sich aus zwei voneinander abhängigen Teilen zusammen, dem Betriebssystem und der Hardware.

Für $creation_time wählt uagen einen Tag der zwischen dem aktuellen Datum und dem Release-Datum liegt. Das Standard-Release-Datum kann über die Kommandozeile überschrieben werden, dabei sollten aber die Firefox-Version und gegebenfalls die Revision ebenfalls angepasst werden, ansonsten könnte ein ungültiger User-Agent generiert werden.

Download und letzte Salbung

uagen (Signatur) steht unter der von OpenBSD übernommenen BSD-Lizenz. Die Datei-Endung .pl ist auf den meisten Betriebssystemen nicht nötig und kann nach dem Runterladen entfernt werden.

uagen sollte auf allen mit Perl ausgestatteten Rechnern laufen.

Debian-Nutzer können uagen auch über ein inoffizielles apt-get-Paket installieren.

Weitere Dokumentation

Diese Seite ist unvollständig und wird nur unregelmäßig aktualisiert, uagen kommt aber mit Dokumentation, die über perldoc uagen angezeigt werden kann.