asphelper.de - Tipps & Skripts - IP-Sperre für einen Zugriffszähler

Link: Wichtiger Hinweis in eigener Sache!


 Autor: Klaus Keller Erstellt am: 2004-07-15 Aufrufe: 7982 


 << Vorheriger Tipp Nächster Tipp >>



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
%>




 << Zum vorherigen Tipp 62:
GUID erzeugen

 Zum nächsten Tipp 64 >>
Zufällige Reihenfolge

top top
© Copyright By Klaus Keller, 2001-2008 - Alle Rechte vorbehalten.