Säker inloggning med asp och access
Förord
I den här artikeln ska jag beskriva hur man kan göra ett inloggningsscript som använder sig av en accessdatabas för att verifiera användaren. Jag kommer även att sätta ett par sessioner som kan vara bra att ha när man är inloggad. Det finns många anledningar till varför man ska ha en inloggning och att göra det på ett sätt där man försvårar för andra att lyckas hacka sig in.Innehåll
»»
Om man håller på att bygga upp en websajt så vill man oftast ha en administrationssida där man dynamiskt kan förändra innehållet på sidan och eftersom man inte vill att vem som helst ska kunna ändra innehållet så är det här sättet alldeles utmärkt.
I det här exemplet så kommer jag att använda mig av 4 sidor och en databas. Den första sidan är själva inloggningsformuläret, den andra innehåller kopplingssträngen till databasen, den tredje är själva inloggningsscriptet och den sista sidan kommer man till efter inloggningen.
Formuläret (loginform.asp)
Ovanstående kod är bara vanlig HTML för att skapa inloggningsformuläret. Målet för formuläret är ”validate.asp” och det är själva delen som verifierar användaren och skickar vidare vid lyckad inloggning. Eftersom jag kommer att skicka tillbaka användaren hit vid en misslyckad inloggning och även efter en lyckad utloggning så kommer jag att lägga in 2 texter som visas beroende på vilken händelse som kommer att ske.
Placera koden där du vill ha meddelandet, ett lämpligt ställe är under så att den visas under formuläret.
Skapa nu en databas om du inte har någon befintlig. I den här artikeln så kommer jag att skapa databasen Inloggning.mdb som jag lägger i en mapp som heter db. Fälten skapar jag i designläge och ser ut som följande:
Tabellen döper jag till tblUsers och userID definieras som primärnyckel.
Nästa steg är att skapa sidan som innehåller kopplingen till databasen så att vi sedan ska kunna skriva vårat inloggningsscript.
Kopplingen (dbconn.asp)
I den här koden så sätts en funktion som heter connect. En variabel som vi kallar objConn deklareras och instansieras som ett nytt Objekt. Det är alltid bra att ha för vana att skriva ut variabelnamn på ett korrekt sätt. Efter att objConn har skapats som ett nytt Objekt så öppnas den med kopplingssträngen till databasen.
Vi avslutar med att associera funktionsnamnet med Objektet.
Verifieringen av användaren (validate.asp)
Nu när formuläret, kopplingssträngen och databasen är klar så är det dags att sköta om själva själva inloggningsförfarandet.
Till att börja med så måste vi förhindra att innehållet i http-huvudet skickas till klienten för tidigt, detta gör vi med Response.Buffer=True och efter det så inkluderas kopplingssträngen som vi tidigare skrev. Inkludera den med <!-- #include virtual="dbconn.asp" --> eller <!-- #include file="dbconn.asp" -->. Båda sätten går bra, men det är rekommenderat med virtual. Med virtual så börjar man med / för att starta i roten och sen ange sökvägen till filen, ex <!-- #include virtual="/inc/conn/dbconn.asp" --> för att leta I mappen inc som ligger i roten och undermappen till den där filen finns.
Nu när själva verifieringen börjar så deklarerar man de variabler som behövs och efter det hämtar in informationen från textfälten i loginform.asp
Nu har vi satt våra variabler och även lagt in IP-adressen i variabeln. Därefter så hämtas informationen från textfälten in och placeras i respektive variabel. I functions.asp har jag en funktion som eliminerar s.k. SQL Injections som kan smälla SQL-satsen och det är FriendlySQL som ser till att det händer.
Nu öppnar vi den koppling till databasen som vi tidigare skapade och inkluderade I filen. Efter det så är det dags att kolla med en SQL-sats om användarnamnet och lösenordet som finns i variabeln överensstämmer med informationen som finns i databasen.
För att kolla så att användaren finns så använder vi en If-sats för att verifiera. Finns användaren så når inte RS slutet på filen eftersom en användare har hittats, annars så blir RS falskt och villkoret uppfylls inte så användaren kan skickas tillbaka till inloggningssidan för att kontrollera sina uppgifter.
Det vi nu har gjort med den här If-satsen är att bekräfta användaren. Finns användaren så sätts 4 sessioner, en för användarID-t, Användarens namn och även Datum och IP-nummer. Sedan uppdateras tabellen med Datum för att man ska kunna kolla in när man senast loggade in och vilket IP man kom från. Och när IF-satsen blev sann så loggades man in och skickas därefter till den skyddade sidan (index.asp). Om inloggningen misslyckades så skickas man tillbaka till inloggningsformuläret med en sträng som talar om att felmeddelandet ska visas som vi skapade i loginformuläret.
Inloggningen avslutas med att man stänger de objekt som man öppnade.
Lyckad inloggning (index.asp)
Lyckas inloggningen så har du nu kommit till indexsidan och kan börja skapa det innehåll som du vill hålla skyddat. När du är inloggad efter att ha gått igenom den här artikeln så kommer du att se olika saker beroende på vad som finns inlagt i databasen.
Antingen kommer detta att visas
Eller detta, lägg märke till det som står under IP-numret.
Koden för detta är:
De två första raderna inkluderar kopplingen till databasen och den andra är en liten ”godislåda” där man kan stoppa in alla sina variabler som man vill använda och raden efter väljer allt i databasen där den aktuella användaren är inloggad. Resten är bara vanlig HTML förutom ASP-n som visar vem som är inloggad, när och från vilket IP. Raden efter kollar om kolumnen Website är tom eller inte. Är den inte tom så visas länken till användarens sida, annars så skrivs ett meddelande ut. Till sist så avslutar jag med utloggningen ”logout.asp”.
När man ska logga ut så räcker det i vaniga fall bara med enbart en rad och det är Session.Abandon som dödar alla aktiva sessioner. I mitt exempel så har jag förutom det en rad som skickar vidare användaren till loginformuläret med ett meddelande om att man är utloggad och lite kod som tar bort bocken i databasen som visar att man är inloggad. Koden för min logout.asp är:
Nu har du lärt dig hur du skapar en koppling till atabasen och hur du använder den för att logga in till en sida. Det här är bara grunden så det finns mycket mer man kan göra för att förbättra säkerheten, hitta nya användningsområden med mera.
Obs! Detta dokument innehåller fel i html-taggar, en sluttagg saknas. Vänligen korrigera dessa!
I det här exemplet så kommer jag att använda mig av 4 sidor och en databas. Den första sidan är själva inloggningsformuläret, den andra innehåller kopplingssträngen till databasen, den tredje är själva inloggningsscriptet och den sista sidan kommer man till efter inloggningen.
Formuläret (loginform.asp)
Logga in till min lösenordsskyddade sida
Logga in
Ovanstående kod är bara vanlig HTML för att skapa inloggningsformuläret. Målet för formuläret är ”validate.asp” och det är själva delen som verifierar användaren och skickar vidare vid lyckad inloggning. Eftersom jag kommer att skicka tillbaka användaren hit vid en misslyckad inloggning och även efter en lyckad utloggning så kommer jag att lägga in 2 texter som visas beroende på vilken händelse som kommer att ske.
<%If Request("error") = "notvalidated" Then%>
<FONT COLOR="#FF0000">Inloggningen misslyckades, försök igen</FONT>
<%End If%>
<%If Request(“do”) = “logout” Then%>
<FONT COLOR=”#FF0000”>
Du är nu utloggad, för att inte andra ska kunna komma in
genom att gå bakåt så är det rekommenderat att stänga webläsaren
<%End If%>
Placera koden där du vill ha meddelandet, ett lämpligt ställe är under så att den visas under formuläret.
Databasen
Skapa nu en databas om du inte har någon befintlig. I den här artikeln så kommer jag att skapa databasen Inloggning.mdb som jag lägger i en mapp som heter db. Fälten skapar jag i designläge och ser ut som följande:
Fältnamn | Datatyp | Beskrivning |
---|---|---|
userID | Räknare | En räknare så att man inte får 2 identiska poster |
username | Text | Användarens användarnamn |
password | Text | Användarens lösenord |
FullName | Text | Användarens fulla namn |
Website | Text | Personlig sida som varje familjemedlem kan ha |
Date | Text | Datum då senaste inloggning skedde |
IP | Text | IP-nummer från senaste inloggning |
Inloggad | Text | Markerar om man är inloggad eller inte |
Tabellen döper jag till tblUsers och userID definieras som primärnyckel.
Nästa steg är att skapa sidan som innehåller kopplingen till databasen så att vi sedan ska kunna skriva vårat inloggningsscript.
Kopplingen (dbconn.asp)
<%
Function connect()
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= "& server.MapPath("db/Inloggning.mdb") & ";"
Set connect = objConn
End Function
set objConn = Connect()
%>
I den här koden så sätts en funktion som heter connect. En variabel som vi kallar objConn deklareras och instansieras som ett nytt Objekt. Det är alltid bra att ha för vana att skriva ut variabelnamn på ett korrekt sätt. Efter att objConn har skapats som ett nytt Objekt så öppnas den med kopplingssträngen till databasen.
Vi avslutar med att associera funktionsnamnet med Objektet.
Verifieringen av användaren (validate.asp)
Nu när formuläret, kopplingssträngen och databasen är klar så är det dags att sköta om själva själva inloggningsförfarandet.
Till att börja med så måste vi förhindra att innehållet i http-huvudet skickas till klienten för tidigt, detta gör vi med Response.Buffer=True och efter det så inkluderas kopplingssträngen som vi tidigare skrev. Inkludera den med <!-- #include virtual="dbconn.asp" --> eller <!-- #include file="dbconn.asp" -->. Båda sätten går bra, men det är rekommenderat med virtual. Med virtual så börjar man med / för att starta i roten och sen ange sökvägen till filen, ex <!-- #include virtual="/inc/conn/dbconn.asp" --> för att leta I mappen inc som ligger i roten och undermappen till den där filen finns.
Nu när själva verifieringen börjar så deklarerar man de variabler som behövs och efter det hämtar in informationen från textfälten i loginform.asp
<% Response.Buffer=True %>
<%
'Deklarera några av variablerna
Dim strAnvNamn, strLosen, objConn, Var, objRS, IP, Datum
Set Var = Request.ServerVariables
IP = Var("REMOTE_ADDR")
Datum = Date
'Hämta info från formulären
strAnvNamn = FriendlySQL (Request.Form ("txtUsername"))
strLosen = FriendlySQL (Request.Form ("txtPassword"))
Nu har vi satt våra variabler och även lagt in IP-adressen i variabeln. Därefter så hämtas informationen från textfälten in och placeras i respektive variabel. I functions.asp har jag en funktion som eliminerar s.k. SQL Injections som kan smälla SQL-satsen och det är FriendlySQL som ser till att det händer.
'Öppna en koppling till DB
SET objConn = connect()
'Kör SQL och sätt ett RecordSet
Dim SQL
SQL = "SELECT * FROM tblUsers WHERE username = '" & strAnvNamn _
& "' AND password = '" & strLosen & "'"
'Response.write SQL
'Response.End
Set objRS= objConn.Execute(SQL)
Nu öppnar vi den koppling till databasen som vi tidigare skapade och inkluderade I filen. Efter det så är det dags att kolla med en SQL-sats om användarnamnet och lösenordet som finns i variabeln överensstämmer med informationen som finns i databasen.
För att kolla så att användaren finns så använder vi en If-sats för att verifiera. Finns användaren så når inte RS slutet på filen eftersom en användare har hittats, annars så blir RS falskt och villkoret uppfylls inte så användaren kan skickas tillbaka till inloggningssidan för att kontrollera sina uppgifter.
'Sätt Sessionsvariabler och verifiera
If NOT objRS.EOF THEN
Session("inloggad") = False
Session("UID") = objRS("userID")
Session("Name") = objRS("FullName")
Session("Datum") = objRS("Datum")
Session("IP") = objRS("IP")
'Uppdatera databasen
objConn.Execute("Update tblUsers SET IP= '" & IP & "', Datum = '" & Datum & "' WHERE userID= " & Session("UID") &"")
'Kolla om man ska vidare eller komma till en errorsida
Response.Redirect "index.asp"
Else
Response.Redirect "loginform.asp?error=notvalidated"
End If
Det vi nu har gjort med den här If-satsen är att bekräfta användaren. Finns användaren så sätts 4 sessioner, en för användarID-t, Användarens namn och även Datum och IP-nummer. Sedan uppdateras tabellen med Datum för att man ska kunna kolla in när man senast loggade in och vilket IP man kom från. Och när IF-satsen blev sann så loggades man in och skickas därefter till den skyddade sidan (index.asp). Om inloggningen misslyckades så skickas man tillbaka till inloggningsformuläret med en sträng som talar om att felmeddelandet ska visas som vi skapade i loginformuläret.
Inloggningen avslutas med att man stänger de objekt som man öppnade.
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Lyckad inloggning (index.asp)
Lyckas inloggningen så har du nu kommit till indexsidan och kan börja skapa det innehåll som du vill hålla skyddat. När du är inloggad efter att ha gått igenom den här artikeln så kommer du att se olika saker beroende på vad som finns inlagt i databasen.
Antingen kommer detta att visas
Eller detta, lägg märke till det som står under IP-numret.
Koden för detta är:
<%Set user=objConn.Execute("Select * From tblUsers WHERE userID="& Session("UID") & "")%>
Välkommen <%=Session("Name")%>, Du loggade in <%=user("Datum")%> , från IP-nummer <%=user("IP")%>
<HR>
<%If Web <> "" Then%>
Gå till din sida på <a href="<%=Web%>"><%=Web%>
<%Else%>
Du har inte angett någon sida som är din egna än
<%End If%>
För att ingen annan ska kunna använda din session
så är det rekommenderat att logga ut först.
De två första raderna inkluderar kopplingen till databasen och den andra är en liten ”godislåda” där man kan stoppa in alla sina variabler som man vill använda och raden efter väljer allt i databasen där den aktuella användaren är inloggad. Resten är bara vanlig HTML förutom ASP-n som visar vem som är inloggad, när och från vilket IP. Raden efter kollar om kolumnen Website är tom eller inte. Är den inte tom så visas länken till användarens sida, annars så skrivs ett meddelande ut. Till sist så avslutar jag med utloggningen ”logout.asp”.
Logga ut användare
När man ska logga ut så räcker det i vaniga fall bara med enbart en rad och det är Session.Abandon som dödar alla aktiva sessioner. I mitt exempel så har jag förutom det en rad som skickar vidare användaren till loginformuläret med ett meddelande om att man är utloggad och lite kod som tar bort bocken i databasen som visar att man är inloggad. Koden för min logout.asp är:
<%
Session.Abandon
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
SET objConn = connect()
objConn.Execute("Update tblUsers SET inloggad = False WHERE userID="&Session("UID")&"")
Response.Redirect "loginform.asp?do=logout"
%>
Nu har du lärt dig hur du skapar en koppling till atabasen och hur du använder den för att logga in till en sida. Det här är bara grunden så det finns mycket mer man kan göra för att förbättra säkerheten, hitta nya användningsområden med mera.
Obs! Detta dokument innehåller fel i html-taggar, en sluttagg saknas. Vänligen korrigera dessa!
0 Kommentarer