Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Benutzerverfolgung in ASP

Geschrieben von: Stefan Mayer
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

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 Datenbank

In 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 mitloggen

Beigefü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:

  1. LogPage - dieser Parameter ist die Seitenbezeichnung
  2. Comment - hier kann ein Kommentar eingefügt werden. Bleibt der Parameter leer, so wird der Name der verweisenden Seite eingetragen. Diese Information ist für eine spätere Auswertung sehr wichtig, weil so festgestellt werden kann, woher die Besucher kommen. Also keinen Kommentar eintragen, wenn er nicht wirklich nötig ist!
  3. LookUp - hier kann die Hostnamenssuche aktiviert oder deaktiviert werden. Wird "TRUE" übergeben, so wird der Hostname mit in die Datenbank eingetragen.

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 Datenbank

Nachdem 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 Anpassungen

Um 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ßbemerkung

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

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001206.zip

Verwandte Artikel

Benutzerverwaltung leicht gemacht: Teil 1
http:/www.aspheute.com/artikel/20020429.htm
Besucherverfolgung für Fortgeschrittene
http:/www.aspheute.com/artikel/20020121.htm

Links zu anderen Sites

Browsercap.ini (die aktuellen Browserdefinitionen)
http://www.asptracker.com

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.