» Start & Installation » ASP-Grundlagen » VBScript » Datenbanken » Erweiterte Techniken » Fehlercode-Suche » FAQ » Forum für aspfehlercodes » ASP » JavaScript » ASCII & ANSI » HTTP-Statuscodes » Codepage » LCID » VBScript » JScript
|
Link: Wichtiger Hinweis in eigener Sache!
| Autor: Klaus Keller | Erstellt am: 2004-07-15 | Aufrufe: 7982 |
Tipp 63: IP-Sperre für einen Zugriffszähler
Ein Counter ist dazu da, die Anzahl der Besucher zu zählen. Leider wird bei den meisten Counter jeder Seitenaufruf gezählt, was nicht immer so gewollt ist. Denn es sollen ja die Besucher gezählt werden und nicht die Seitenaufrufe. Auch kann es dazu dienen, künstlich die Beliebtheit von Beiträgen durch mehrmalige Aufrufe zu steigern.
Es gibt mehrere Ansätze für eine Lösung. Die erste Möglichkeit funktioniert über eine Application-Variable, dabei wird die IP-Adresse des Besuchers in einem Array inklusive der Uhrzeit gespeichert. Beim Aufruf wird dann geprüft ob die IP bereits vorhanden ist, wenn ja ob mehr als 20 Minuten vergangen sind. Natürlich ist die Zeit einstellbar. Wenn mehr als 20 Minuten wird der Zähler hochgesetzt, falls nicht wird eine neue Zeit gesetzt.
Eines der wesentlichen Probleme dabei ist die IP-Adresse. Denn viele haben wechselnde IP-Adressen. So kann es durchaus vorkommen, daß bei jeder Ressourcenanforderung (ASPSeite, Bild) eine andere IP-Adresse verwendet wird. Allerdings wechselt normalerweise nur der letzten Zahlenblock der Adresse. Falls Sie diese wechselnde IP-Adressen mit berücksichtigen möchten, müssen Sie von den IP-Adressen nur den letzten Zahlenblock entfernen. Das wurde jedoch bei dem vorliegenden Skript nicht berücksichtigt, ist jedoch recht einfach zu verwirklichen:
| IP = left(IP,instrrev(IP, ".",-1)) |
Natürlich gibt es nun das Problem, daß immer mehr Einträge in die Application-Variable stattfinden, also müssen die alten Einträge gelöscht werden, dazu wird eine Schleife eingesetzt und auf Zeitüberschreitungen geprüft. Falls ein Eintrag zu lange dabei ist, wird dieser gelöscht. Der Nachteil dieser Version ist die Performance denn da wird bei jedem Seitenaufruf eine Schleife durchlaufen. Vorteil ist, daß diese unabhängig von irgendwelchen Einstellungen beim Client funktioniert.
Die zweite Möglichkeit wird über ein Session-Cookie realisiert, natürlich funktioniert das auch nur dann zuverlässig, wenn der Besucher Session-Cookies akzeptiert. Der Vorteil dieser Version ist eine bessere Performance gegenüber der ersten Version mit den Application-Variablen. Beim Aufruf wird die Zeit in eine Session-Variable geschrieben. Beim nächsten Aufruf wird nun geprüft, seit wann der letzte Aufruf erfolgte, falls grösser als z.B. 20 Minuten, wird der Counter erneut gesetzt.
Zuletzt noch die Dritte Möglichkeit, hier wird einfach nur geprüft, ob eine bestimmte Session-Variable ein Wert hat, wenn nein wird ein Wert gesetzt und der Counter hochgezählt. Das gesamte Skript inklusive den Aufrufen dazu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| <% Response.Write("Mit Application:") Counter_Application()
Response.Write("<br>Mit Session:") Counter_Session()
Response.Write("<br>Mit Session, 2te Methode:") Counter_Session2()
Public Function Counter_Application() Dim arrIP(), TempArrIP, z, i, IP, IPFound, TempIP, TempTime
IP = Request.ServerVariables("REMOTE_ADDR") IPFound = false If len(Application("arrIP")) > 0 Then z = 0 TempArrIP = Split(Application("arrIP")) For i = 0 To Ubound(TempArrIP) If len(TempArrIP(i)) > 0 Then TempIP = left(TempArrIP(i),len(TempArrIP(i))-8) TempTime = right(TempArrIP(i),8) 'Response.Write("<br>TempIP:" & TempIP) 'Response.Write("<br>TempTime:" & TempTime) If CStr(TempIP) = CStr(IP) Then If DateDiff("m",TempTime,Time()) <= 20 Then ReDim Preserve arrIP(z+1) arrIP(z) = TempIP & Time() z = z + 1 IPFound = true End If Else ReDim Preserve arrIP(z+1) arrIP(z) = TempArrIP(i) z = z + 1 End If End If Next
If IPFound Then Counter(false) Else ReDim Preserve arrIP(Ubound(arrIP)+1) arrIP(Ubound(arrIP)) = IP & Time Counter(true) End If Application.Lock Application("arrIP") = Join(arrIP) Application.UnLock Else Counter(true) Application.Lock Application("arrIP") = IP & Time Application.UnLock End If End Function
Public Function Counter_Session() Dim SetSessionCounter If len(Session("CounterTime")) > 0 Then If DateDiff("m",Session("CounterTime"),Time()) > 20 Then Counter(true) Else Counter(false) End If Else Counter(true) End If Session("CounterTime") = time() End Function
Public Function Counter_Session2() If len(Session("SetCounter")) > 0 Then Counter(false) Else Counter(true) Session("SetCounter") = "Gesetzt" End If End Function
Public Function Counter(ByVal SetCounter) Dim rs, strPfadDB strPfadDB = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ Server.MapPath("~db\Counter.mdb") & _ ";Mode=ReadWrite;Persist Security Info=False"
set rs = Server.CreateObject("ADODB.Recordset") rs.Open "tblCounter",strPfadDB,1,2 If SetCounter Then rs.Update rs.Fields("Counter").Value = rs.Fields("Counter").Value + 1 Response.Write(rs.Fields("Counter").Value) rs.UpdateBatch Else Response.Write(rs.Fields("Counter").Value) End If rs.Close set rs = nothing End Function %> |
|
|