FreundVonCgis: HTTP_USER_AGENT wird nicht komplett neu überschrieben?Stat.log

NAbend liebe leut,
Ok mag sein dass es themen darüber gibt hier im selfhtml,aber nach zwei stunden
suchen post ich mal mein problem so:

Ich hab ein cgi dass ip und HTTP_USER_AGENT im stat.log speichert zwecks überwachung
im memberbereich.
ich hab das cgi so abgeändert dass es nicht nur ip zählt sonder auch der user_agent dies
desshalb weil das cgi oft fehlalarm ausgibt,wenn z.B. ein Aol user
mit einer statischen IP einloggt nun gut die log datei sieht z.B. wenn normal so aus:
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; QXW0334w)*62.3.239.7*0*Aug 15*steve
wenn er jetzt mit dem selben usernamen einloggt aber einen anderen browser benutzt dann sieht das so aus:
Mozilla/4.0 (compatible; M  Mozilla/4.78 [de] (Win98; U)*62.3.239.7*0*Aug 15*steve

ist aber nicht korrekt

in dem fall müsste aber der agent so aussehen:
Mozilla/4.78 [de] (Win98; U)*62.3.239.7*0*Aug 15*steve
warum wird denn Mozilla/4.0 (compatible; M  noch angehängt oder bleibt es stehen
vom letzten user ?
Im cgi ist das so geschrieben:
$loginlog         =        'log/stat';
$abusecount        =        2;
$maxusers        =        150;
$doflocks        = 1;
$date                 = date;
$date_today = join( " ", (split(" ",$date)) [1,2] );
$username         = $ENV{'REMOTE_USER'};
$ip_now         = $ENV{'REMOTE_ADDR'};
$uag_now         = $ENV{'HTTP_USER_AGENT'};

print "Content-type: text/html\n\n";
$maxsize=$maxusers*8*4; #uname+pass average length is 8 chars
unlink($loginlog) if ((stat($loginlog))[7] > $maxsize);
exit if (!$username);

if (dbmopen(logins,$loginlog,0666))
{
        flock(logins,2) if ($doflocks);
        ($uag_last,$ip_last,$count_last,$date_last) = split(/\*/,$logins{$username});

$logins{$username} = "  $uag_now*$ip_now*$count_last*$date_today*";
        dbmclose(logins);
        flock(logins,8) if ($doflocks);
also ich hab jetzt nur das reingeschrieben was mit der logdatei zusammenhängt nicht das ganze cgi.
Wäre froh wenn mir damit jemand helfen könnte.
Schönen gruss
FreundVonCgis

  1. Hi,

    Ich hab ein cgi dass ip und HTTP_USER_AGENT im stat.log speichert
    zwecks überwachung im memberbereich.

    warum läßt Du das nicht Deinen Webserver machen? Der kann das alleine
    auch.
    (Apache: Logformat definieren, da können frei wählbare HTTP-Header
    protokolliert werden, also auch der UserAgent.)

    Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; QXW0334w)*62.3.239.7*0*Aug 15*steve

    Dein Trennzeichen ist nicht ungefährlich. Was hindert mich daran, Dir
    einen Request mit einem '*' im UserAgent (den ich in meiner Client-
    Konfiguration frei wählen kann) zu senden?

    Es gibt kein zuverlässiges Trennzeichen für UserAgent. Deshalb solltest
    Du diesesn Feld ans Ende der Zeile stellen und mit "split()" dann den
    ganzen Rest der Zeile diesem Feld zuweisen.

    $date                 = date;

    Lies "time()" und "localtime" für eine bessere Alternative.

    if (dbmopen(logins,$loginlog,0666))

    Hm - ich würde dafür ja nicht gleich dbmopen() verwenden.

    Reicht denn eine normale (am Ende erweiterte) Datei nicht aus?
    Datenerfassung und Datenverdichtung gehören doch ohnehin in zwei
    verschiedene Anwendungen.

    ($uag_last,$ip_last,$count_last,$date_last) = split(/\*/,$logins{$username});

    Genau das meinte ich. Setze mal den UserAgent auf die letzte Position,
    der wird Dir beim split() früher oder später Probleme bereiten - ein '*'
    drin und nichts funktioniert mehr.

    Viele Grüße
          Michael