Benutzerverfolgung in ASP
Geschrieben von: Stefan Mayer Der Microsoft Internet Information Server protokolliert jeden Besucher und jede Datei, die abgerufen wurde im Logfile mit. Oft ist das Logfile jedoch so umfangreich, daß die gewünschte Analyse und Auswertung nur mit teuren Programmen möglich ist (WebTrends, etc). Abgesehen davon hat man nicht immer Zugriff auf das Original-Logfile, was besonders bei Free-Providern häufig der Fall ist. Die hier vorgestellte Variante ermöglicht eine recht einfache "Benutzerverfolgung", in dem einerseits ausgewählte Seiten gezielt in eine Datenbank protokolliert werden, andererseits wird eine Online-Auswertungsmöglichkeit vorgestellt. Die DatenbankIn der vorgestellten Version heißt die Datenbank LOG.MDB. Es handelt sich um eine MS-Access 2000 - Datenbank, die in E:\DBROOT abgespeichert ist. Die Datenbank enthält die Tabelle T_LOG. In diese Tabelle könnten beliebig viele zusätzliche Felder eingefügt werden oder andere Änderungen vorgenommen werden. In der beschriebenen Version sind folgende Felder enthalten:
ID Primärschlüssel/Autowert Datum Enthält das Datum & Zeit des Zugriffs Seite Enthält den Seitentitel IP1 IP des Besuchers IP2 IP, Teil 2 IP3 IP, Teil 3 IP4 IP, Teil 4 HOST Hostname (aufgelöst) des Besuchers HTTP_USER_AGENT Browser-Identifikation HTTP_REFERER Zugriffsverweis gekommen von Browser Browser-Name Version Browser-Versionsnummer
Seiten in der Datenbank mitloggenBeigefügt ist eine Include-Datei, die zwei Funktionen enthält, die den Eintrag in die Datenbank vornehmen. Sie unterscheiden sich darin, daß die erste Funktion [MakeStat(LogPage)] einen Seitezugriff einträgt, währenddessen die zweite Funktion [MakeStatTxt(LogPage, InfoText)] zusätzlich einen Informationstext einträgt, anstatt des Zugriffsverweises. Die Funktion MakeStat
function MakeStat(LogPage, Comment, LookUp) Es werden 3 Parameter übergeben:
Jetzt aber zum Sourcecode der Funktion. Hier ist der erste Teil:
REM Daten ermitteln: Browser & Version Set BC = Server.CreateObject("MSWC.BrowserType") txtBro = bc.browser if txtBro = "" Then txtBro = "-" txtVer = bc.Version if txtVer = "" Then txtVer = "-" Set BC = Nothing Mittels der BrowserType Komponente läßt sich der verwendete Browser des Besuchers ermitteln - allerdings nur dann korrekt, wenn die aktuellen Browserdefinitionen (browsercap.ini) geladen sind - der Link zum downloaden der aktuellsten Version findet sich am BeitragsendeREM Daten ermitteln: IP-Adresse und Host-Name [letzteres nur bei LookUp=TRUE]
arrIP = Split(Request.ServerVariables("REMOTE_ADDR"),".") If LookUp Then Set DNS = Server.CreateObject("DNS.NSLookup") txtHost = DNS.RevNSLookup(Request.ServerVariables("REMOTE_ADDR")) Set DNS = Nothing Else txtHost = "-" End If Die IP-Adresse wird ermittelt und in ein Array (arrIP(0)-arrIP(3)) zerlegt. Weiters wird - wenn der Parameter LookUp TRUE ist - der Hostname zur IP-Adresse ermittelt. Diese Arbeit übernimmt eine DNS-Komponente. Da es eine Vielzahl verschiedener DNS oder IP - Komponenten gibt, muß gegebenenfalls die Syntax beim Reverse-Lookup sowie beim Aufruf der Komponente verändert werden.
REM Daten ermitteln: alles Andere txtAgent = Request.ServerVariables("HTTP_USER_AGENT") if txtAgent = "" Then txtAgent = "-" If Comment = "" Then txtRefer = Request.ServerVariables("HTTP_REFERER") if txtRefer = "" Then txtRefer = "-" Else txtRefer = Comment End If Abschließend werden noch die fehlenden zwei Daten ermittelt - der User Agent und der Referer.
REM Datenbank öffnen strConn = "Driver={Microsoft Access Driver (*.mdb)};DriverID=25;DBQ=" strConn = strConn & Server.MapPath("log.mdb") strConn = strConn & ";FIL=MS Access;MaxBufferSize=512;PageTimeout=5;" In diesem Fall liegt die Datenbank im selben Verzeichnis wie das Script - Nachteil: Die ganze Datenbank kann von jedem Besucher heruntergeladen werden - wenn der Name bekannt ist. Es ist jedenfalls sinnvoller, die Datenbank in einen NICHT freigegebenen Ordner zu legen, was jedoch von diversen Free-Providern nicht unterstützt wird.
Set Conn = CreateObject("ADODB.Connection") Conn.Open strConn Set RS = CreateObject("ADODB.Recordset") RS.Cursortype = 1 RS.LockType = 3 RS.Open "SELECT * FORM T_LOG WHERE ID=0", Conn RS.AddNew RS("Seite") = LogPage RS("IP1") = arrIp(0) RS("IP2") = arrIp(1) RS("IP3") = arrIp(2) RS("IP4") = arrIp(3) RS("Host") = txtHost RS("HTTP_USER_AGENT") = txtAgent RS("HTTP_REFERER") = txtRefer RS("Browser") = txtBro RS("Version") = txtVer RS.Update RS.Close Conn.Close Um einen Eintrag in die Datenbank zu machen, muß in die ASP-Datei, die protokolliert werden soll, folgender Code am Anfang eingetragen werden:
<!-- #INCLUDE FILE="stat.asp" --> <% Dummy = MakeStat("Startseite", "", TRUE) %> Zu beachten ist, daß bei dem Include File eventuell ein anderer Pfad angegeben werden muß. Im folgenden Beispiel wird ein fehlgeschlagener Login-Versuch dokumentiert:
<!-- #INCLUDE FILE="stat.inc" --> <% Dummy = MakeStat ("Login", "Zugriff verweigert - falsches Paßwort: "& Request("Passwort"), TRUE) %> Auswertung der DatenbankNachdem Daten gesammelt werden, kann eine Auswertung durchgeführt werden. Diese Auswertung kann von jedermann ganz leicht an individuelle Bedürfnisse angepasst werden - es kommt einfach darauf an, was man über seine Besucher bzw. über deren Verhalten wissen will. Beigefügt ist ein Script (shortstat.asp), das kommentarlos die letzten 100 Besucher anzeigt. In einer Fortsetzung dieses Artikels werden weitere Auswertungs- und Selektionsmöglichkeiten vorgestellt. Das folgende Script sollte ausschließlich dem Webmaster der Website zugänglich sein, da unter umständen hochsensible Daten enthalten sind. Genauso wie beim Erstellen des Eintrags wird die Datenbank geöffnet. Befindet sich diese in einem anderen Verzeichnis, so muß das hier geändert werden.
<% REM Datenbank öffnen strConn = "Driver={Microsoft Access Driver (*.mdb)};DriverID=25;DBQ=" strConn = strConn & Server.MapPath("log.mdb") strConn = strConn & ";FIL=MS Access;MaxBufferSize=512;PageTimeout=5;" Set Conn = CreateObject("ADODB.Connection") Conn.Open strConn Set RS = CreateObject("ADODB.Recordset") RS.Cursortype = 1 RS.LockType = 3 RS.Open "SELECT * FROM T_LOG WHERE (Datum > (Now()-31))ORDER BY Datum DESC", Conn %> Die Datenbank wird geöffnet und alle Datensätze der letzten 31 Tage werden abgefragt - absteigend sortiert, also der neueste Datensatz wird zu Beginn angezeigt.
<b>Die letzten 100 Zugriffe der letzten 31 Tage<p></b> <% response.write "</p><table><tr><td><font size=1>#</font></td>" response.write "<td><font size=1>Tag</font></td>" response.write "<td><font size=1>Zeit</font></td>" response.write "<td><font size=1>Seite</font></td>" response.write "<td><font size=1>IP-Adresse</font></td>" response.write "<td><font size=1>Host-Name</font></td>" response.write "<td><font size=1>Browser-Info</font></td>" response.write "<td><font size=1>Linkt von</font></td>" response.write "<td><font size=1></font></td></form></tr>" ... Der Tabellenkopf wird erstellt .
i=1 while (not rs.eof) and (i<101) Die ersten 100 Datensätze werden angezeigt, es sei denn, es existieren nicht so viele.
rem Die Nummer response.write ("<tr><td><font size=1>") response.write (i) response.write ("</td>") Als erstes Tabellenfeld wird die laufende Nummer ausgegeben
rem der Tag: Out = rs("Datum") out = left(out,instr(out, ".")) If Out = DAlt Then Out = "" else DAlt = out End If response.write ("<td><font size=1>") response.write (out) response.write ("</td>") In die nächste Spalte kommt das Datum. Das Datum wird pro Tag jedoch nur einmal ausgegeben; das macht das Ergebnis besser lesbar!
rem die Zeit: Out = rs("Datum") Out = Mid(Out, Instr(Out, ":")-2) response.write ("<td><font size=1>") response.write (out) response.write ("</td>") Die Uhrzeit wird komplett ausgegeben.
rem die Seite: Out = rs("Seite") response.write ("<td><font size=1>") response.write (out) response.write ("</td>") Hier wird der Seitenname, der über die Funktion eingegeben wurde, angezeigt.
rem die IP-Adresse: Out = rs("IP1")&"."& rs("IP2") & "." & rs("IP3") & "." & rs("IP4") response.write ("<td><font size=1>") response.write (out) response.write ("</td>") Die IP-Adresse muß aus ihren 4 Bestandteilen wieder zusammengesetzt werden.
rem der Host: Out = rs("HOST") response.write ("<td><font size=1>") response.write (out) response.write ("</td>") Der Host-Name wird daneben ausgegeben.
rem der Browser: Out = rs("HTTP_USER_AGENT") response.write ("<td><font size=1>") response.write (out) response.write ("</td>") Ebenfalls wie "Browserinformation"
rem der Verweiser: Out = rs("HTTP_REFERER") response.write ("<td><font size=1>") response.write (out) response.write ("</td>") Und - sehr interessant - die Herkunft des Besuchers.
Rem der Browser: Out = rs("Browser")& ", "& rs("Version") response.write ("<td><font size=1>") response.write (out) response.write ("</td>") response.write ("</tr>") out = "" Und für alle, die wissen wollen, ob Netscape oder Internet Explorer häufiger verwendet wird - hier die Bestätigung.
rs.Movenext i=i+1 wend RS.CLOSE Conn.Close %> </table> Abschließend werden Datenbank und Tabelle geschlossen. Das war's. Die hier beschriebene Abfrage läßt sich noch verfeinern und auf die eigenen Bedürfnisse anpassen; sie kann jedoch auch ohne große Modifikationen verwendet werden. So können auch Besucher gezählt werden, eine Netscape / Internet-Explorer - Statistik allen Besuchern angezeigt werden, etc. Die Daten können jedenfalls auch mit allen Möglichkeiten, die Access bietet, verarbeitet und ausgewertet werden. Notwendige AnpassungenUm das beschriebene Beispiel verwenden zu können, muß die Datenbank auf dem Server abgelegt werden und die Pfade in der Include-Datei sowie in ShowStat.asp entsprechend geändert werden. Es empfiehlt sich unter Umständen, die Datenbank in ein Verzeichnis zu legen, wo sie vom Webbrowser nicht heruntergeladen werden kann. Wird das gemacht, so muß der Zugriffspfad auf die Datenbank geändert werden. SchlußbemerkungDas beschriebene Script ist ein recht gutes Werkzeug, um die Zugriffe auf kleinere Websites zu protokollieren. Es ist auf jeden Fall allerdings mit großer Sorgfalt vorzugehen, da die gesammelten Daten nicht in falsche Hände geraten sollten. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Benutzerverwaltung leicht gemacht: Teil 1 Links zu anderen Sites
Browsercap.ini (die aktuellen Browserdefinitionen) Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |