» 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: 2002-10-16 | Geändert am: 2005-01-18 | Aufrufe: 27877 |
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"> </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 O G I 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"> </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"> </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"> </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
|
|