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

Seit ein paar Jahren wird uagen mit den Privoxy-Quellen ausgeliefert und ist in vielen Privoxy-Paketen enthalten, kann aber natürlich auch über git beschafft werden.

uagen 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.

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.