asphelper.de - Tipps & Skripts - Login bzw. Geschützter Bereich

Link: Wichtiger Hinweis in eigener Sache!


 Autor: Klaus Keller Erstellt am: 2002-10-16  Geändert am: 2005-01-18 Aufrufe: 27877 


 << Vorheriger Tipp Nächster Tipp >>



Tipp 17: Login bzw. Geschützter Bereich



Das nachfolgende Beispiel für einen Login bzw. einen geschützten Bereich ist so einfach wie möglich aufgebaut. Ruft ein Benutzer eine Seite auf, wird per Session-Cookie geprüft, ob ein Login erfolgte. Wenn nicht, wird der Benutzer auf die Login-Seite umgeleitet.

Die Benutzernamen und Passwörter werden in einer Access-Datenbank gespeichert. Nach Eingabe des Namens und des Passworts wird geprüft, ob beide Werte (Name & Passwort) eingegeben wurde. Falls dies nicht erfolgte, wird eine Fehlermeldung angezeigt. Hat der Benutzer den falschen Namen bzw. das falsche Passwort angegeben, wird ebenso eine Fehlermeldung angezeigt.

Die Datenbank ist so wie das gesamte Beispiel so einfach wie möglich aufgebaut, die Benutzer sind in der Tabelle tblUser gespeichert, im Tabellenfeld "User_Name" steht der Benutzername, das Passwort im Tabellenfeld "User_Password".

Sind die Eingaben korrekt, wird der Benutzer auf jene Seite wieder umgeleitet, welche zuerst aufgerufen wurde. Falls der Benutzer direkt die Eingabemaske aufruft, wird der Benutzer auf die Seite "Default.asp" verwiesen.

Im Download sind die für den Login benötigten Dateien vorhanden. Möchten Sie in einer Datei prüfen ob ein Login bereits erfolgte, können Sie dies auf sehr einfache weise durhführen: Sie müssen lediglich die Datei Logincheck.asp inkludieren. Das war es schon! So könnte z.B. eine Datei aussehen, die sich innerhalb des Login-Bereichs befindet:
<!-- #include file="Logincheck.asp" -->

<a href="Logout.asp">Logout</a>

<br /><br /><br /><br />
<center><b>Irgendeine Seite!</b></center>

Der Inkludierung der Logincheck.asp sollte am Seitenanfang erfolgen, da erst dann die Prüfung auf einen Login erfolgt. Ausserdem sollten Sie einen Button für Logout anbieten, auch aus Sicherheitsgründen. In allen Seiten, die innerhalb des Login-Bereiches liegen, sollten Sie ausserdem das Zwischenspeichern in den Browser verhindern, siehe dazu Tipp 11: Zwischenspeichern von ASP-Seiten verhindern

Da dieser Login speziell dafür gedacht ist, daß Sie sich diesen an Ihre Bedürfnisse anpassen und entsprechend erweitern können, nachfolgend einiges vom Quellcode, allerdings wird nicht alles erklärt. Möchten Sie das gesamte Skript einsetzen, laden Sie sich dazu das gesamte Projekt am Ende dieser Seite herunter.

35   
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Public Schritt, User_Name, User_Password, blnError, strSite

strSite = Request("Seite")
Schritt = Request.Form("Schritt")
User_Name = Request.Form("User_Name")
User_Password = Request.Form("User_Password")
blnError = false


%><!-- #include file="~include\vbs_utils.asp" --><%


If len(Schritt) > 0 Then
    If len(User_Name) > 0 AND len(User_Password) > 0 Then
        Call Schritt2(strSite, blnError, User_Name, User_Password, Schritt)
    Else
        blnError = true
        Call LoginMaske(strSite, blnError)
    End if
Else
    Call LoginMaske(strSite, blnError)
End if

In der Zeile 35 werden einige Variablen deklariert. Die Variable Schritt zeigt an, was zu tun ist. Hat diese keinen Wert, wird das Formular für den Angabe eines Namen und des Passworts angezeigt. User_Name und User_Password beinhalten jene Werte, die durch den Besucher ausgefüllt wurden. blnError ist eine Boolean-Variable. Wenn blnError = true, dann hat der Besucher beim Login eine Fehlerhafte Angabe gemacht.

Ab der Zeile 47 wird geprüft, was denn zu tun ist. Falls Schritt einen Wert hat (also Länge grösser als null), dann wird der zweite Schritt ausgeführt. Es wird dann in Zeile 48 geprüft, ob User_Name und User_Password einen Wert beinhaltet, wenn nein wird eine Fehlermeldung angezeigt. Haben diese beide Variablen einen Wert, Schritt2 aufgerufen. Darin wird geprüft, ob die Angaben des Besuchers korrekt sind. Falls User_Name oder User_Password keinen Wert hat (also leer sind), dann wird die eine Fehlermeldung inklusive dem Login-Formular angezeigt. Für die Fehlermeldung wird die Variable blnError auf true gesetzt. Hat die Variable Schritt keinen Wert, wird in Zeile 55 die Loginmaske aufgerufen.

Nachfolgend die Login-Maske, zumeist enthält diese Funktion nur HTML-Code. Falls der Besucher einen Fehler beim Login gemacht hat, wird der eventuell fehlerhafte Name nicht im Formular angezeigt.
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
Private Sub LoginMaske(ByRef strSite, ByRef blnError) %>
<html>
    <head>
        <title>Login</title>
        <style type="text/css">
            font{font-family:verdana;}
            .LoginHeader{font-size:18px;color:#ffffff;font-weight:bold;}
            .LoginSchrift{font-size:12px;color:#000040;font-weight:bold;}
            .LoginHinweis{font-size:11px;color:#000000;font-weight:bold;}
            .LoginFehler{font-size:15px;color:#b01010;font-weight:bold;}
        </style>
    </head>
    <body bgcolor="#ffffff">
      <table align="center" valign="center" height="100%" border="0">
        <tr>
          <td align="center">
            &nbsp;
          </td>
        </tr>
        <form action="Login.asp" method="post" id="form1" name="form1">
        <input type="hidden" name="Schritt" id="Schritt" value="2">
        <input type="hidden" name="Seite" id="Seite" value="<% = strSite %>">
        <tr height=90>
          <td align="center">
            <table bgcolor="#f0f0f0" width="250" cellpadding="1" cellspacing="2">
              <tr bgcolor=#000000 height="10">
                <td height="15" width="100%" align="center" colspan="2">
                  <font class="LoginHeader">L&nbsp;O&nbsp;G&nbsp;I&nbsp;N</font>
                </td>
              </tr>
              <tr height="15">
                <td height="15" align="left" width="140">
                  <font class="LoginSchrift">Name:</font>
                </td>
                <td>
                  <input type="text" id="User_Name" name="User_Name">
                </td>
              </tr>
              <tr height="15" width="140">
                <td>
                  <font class="LoginSchrift">Passwort:</font>
                </td>
                <td>
                  <input type="password" id="User_Password" name="User_Password">
                </td>
              </tr>
              <tr height="1"><td colspan="2">&nbsp;</td></tr>
              <tr>
                <td align="center" colspan="2">
                  <input type=submit id="submit" value="Login" style="width:100px;">
                </td>
              </tr>
            </table>
          </td>
        </tr>
        <tr height=10>
          <td align="center">
            &nbsp;
          </td>
        </tr>
    <% If blnError Then %>
        <tr height=10>
          <td align="center">
            <font class="LoginFehler">
              Fehler: Name oder Passwort fehlt bzw. ist falsch
            </font>
          </td>
        </tr>
    <% End if %>
        <tr height=10>
          <td align="center">
            <font class="LoginHinweis">
              Bitte beachten Sie die Gross- & Kleinschreibung.
            </font>
          </td>
        </tr>
        <tr>
          <td align="center">
            &nbsp;
          </td>
        </tr>
      </form>
      </table>
    </body>
</html>
<%
End Sub

In Zeile 119 wird abgefragt, ob der die Variable blnError wahr ist, wenn ja wird eine Fehlermeldung angezeigt. Die blnError ist dann war, wenn der Besucher bei einem Login-Versuch fehlerhafte Angaben gemacht hat.

Die Funktion Schritt2 prüft, ob die Angaben des Benutzers korrekt sind. Dazu wird ein Recordset erstellt, dem wird dann eine SQL-Anweisung sowie der Datenbank-Treiber zugewiesen. Zuletzt wird das Recordset dann geöffnet.
149   
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
Private Sub Schritt2( _
                        byref strSite, _
                        byref blnError, _
                        byref User_Name, _
                        byref User_Password, _
                        byref Schritt _
                    )
    Dim rs, strConn, strSQL, LoginOK

    set rs = Server.CreateObject("ADODB.Recordset")

    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                Server.MapPath("~db\Login.mdb")
      
    strSQL = "SELECT " & _
                "tblUser.UserID, " & _
                "tblUser.User_Name, " & _
                "tblUser.User_Password " & _
             "FROM tblUser WHERE " & _
                "tblUser.User_Name='" & SQLEncode(User_Name) & "' " & _
                "AND tblUser.User_Password='" & SQLEncode(User_Password) & "'"
      
    rs.Open strSQL, strConn, 3, 1

In Zeile 168 und 169 wird der angegebene Name und das Password in die SQL-Anweisung mit eingebaut. Viele Login-Seiten haben hier einen entscheidenden Fehler die SQL-Injection ermöglichen, diese werden durch die Funktion SQLEncode unterbunden. Die Funktion SQLEncode bedeutet einen deutlichen Zuwachs in der Sicherheit, mehr Infos zu SQLEncode unter Tipp 50: SQLEncode - Sonderzeichen in SQL-Abfragen richtig behandeln. Die Funktion SQLEncode ist in der Datei vbs_utils.asp und wird in Zeile 44 inkludiert.

In Zeile 173 wird LoginOK mit false vorbelegt. Sind die Angaben des Benutzers korrekt, wird LoginOK auf true gesetzt, so daß der Benutzer auf eine andere Seite verwiesen wird. Ist LoginOK auf false, wird eine Fehlermeldung inklusive dem Login-Formular angezeigt.

In Zeile 171 wird das Recordset ja geöffnet, in Zeile 174 wird geprüft ob das Recordset auf eof (end of file) steht. Ist das der Fall, wurde kein Benutzerkonto gefunden, welches zu den Angaben des Besuchers passt.

Wenn es mehr als einen Datensatz gibt, dann stimmt etwas mit den Angaben nicht, daher wird die Anzahl der Datensätze in Zeile 175 geprüft. Falls es mehr als einen Datensatz gibt, und somit ein Loginfehler vorliegt wird nichts getan. Sie erinnern sich? LoginOK ist ja bereits mit false vorbelegt, daher muss hier keine Zuweisung erfolgen.

In Zeile 176 und 177 wird in einer einzigen If-Abfrage geprüft, ob der vom Benutzer angegebene Name mit dem Namen von der Datenbank übereinstimmt. Das gleiche gilt auch für das Password. Warum diese erneute Prüfung? Bei SQL-Anweisung gibt es keine Unterscheidung von Groß- und Kleinbuchstaben. Dies erfolgt erst bei einer If-Abfrage. Wenn die Werte übereinstimmen wird LoginOK auf true gesetzt, die Angaben des Besuchers sind also in Ordnung.
173   
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
    LoginOK = false
    if not rs.EOF then
        if rs.RecordCount = 1 then
            if User_Name = rs.Fields(1).Value and _
              User_Password = rs.Fields(2).Value then
                LoginOK = true
            end if
        end if
    end if
    
    rs.Close
    set rs = nothing
      
    If LoginOK Then
        Session("Login") = true
        If NOT len(strSite) > 0 Then
            strSite = "Default.asp"
        End if
        Response.Redirect(strSite)
    Else
        blnError = true
        Call LoginMaske(strSite, blnError)
    end if
End Sub

In Zeile 183 wird das Recordset geschlossen und das Objekt terminiert, das sollte immer so früh wie möglich geschehen. Ab Zeile 186 wird geprüft, ob LoginOK auf true steht, wenn nein wird eine Fehlermeldung inklusive dem Loginformular angezeigt. Sind die Angaben des Besuchers korrekt, wird der Besucher weitergeleitet. Hat der Besucher eine bestimmte Seite vor dem Login aufgerufen, z.B. die Seite "kontakt.asp", dann wird der Besucher wieder auf diese Seite umgeleitet. Hat der Besucher direkt die Login-Seite aufgerufen, dann wird der Besucher auf die Startseite (Default.asp) verwiesen.

Soweit ist der Login fertig, natürlich darf die Datenbank nicht vergessen werden, auch diese ist so einfach wie möglich aufgebaut.


Herunterladen: Tip17.zip


 << Zum vorherigen Tipp 16:
Aktueller HTTP-Pfad ermitteln

 Zum nächsten Tipp 18 >>
Email-Adresse prüfen, die zweite

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