HTTP_USER_AGENT wird nicht komplett neu überschrieben?Stat.log
FreundVonCgis
- cgi
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
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