21. maj 2007 - 23:54Der er
36 kommentarer og 1 løsning
Mere sikker loginsystem
Er det mulig at gøre dette logingsystem mere sikker. For det er åbenbart mulig at komme igennem på en eller anden måde.
<% ' Hvis der er blevet trykket på knappen "Login" If Request.Form("Action") = "Login" Then ' Her forberedes de indtastede værdier til validering strUID = Trim(Replace(Request.Form("Brugernavn"),"'","")) strPWD = Trim(Replace(Request.Form("Adgangskode"),"'",""))
' Hvis der er skrevet noget i både brugernavn og adgangskode If Len(strUID) > 0 And Len(strPWD) > 0 Then
' DSNLess forbindelse til databasen Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source=d:\home\dyk\db\Medlemmer.mdb;" ' Opbygning af SQL streng strSQL = "SELECT Medlemsnummer FROM Medlemmer"&_ " WHERE (Fornavn = '" & strUID & "')"&_ " AND (Adgangskode = '" & strPWD & "')"
Set rs = myConn.Execute(strSQL) If Not (rs.BOF Or rs.EOF) Then ' Hvis brugeren fandtes i databasen intUID = rs("Medlemsnummer") Else ' Hvis brugeren ikke fandtes i databasen strERR = "Den angivne kombination af fornavn og adgangskode findes ikke. Husk at adgangskoden er din fødselsdag Eks.31-12-66 husk bindestregerne mellem tallene. Kontakt evt. Nauticas web-ansvarlige kasserer@dyk-.dk via mail " End If
' Rydder op i vores connection objekt myConn.Close Set myConn = Nothing
If Len(intUID) Then ' Hvis variablen intUID indeholder en værdi sættes denne i sessionen "UserID" og brugeren bliver sendt videre Session("UserID") = intUID Response.Redirect("lokside.asp") End If Else ' Hvis der ikke var angivet brugernavn og adgangskode strErr = "Du skal skrive både brugernavn og adgangskode" End If
If Len(strErr) > 0 Then ' Her laves fejlmeddelsen om til rød skrift strErr = "<p><font color=red>" & strErr & "</font></p>" End If End If %>
<% ' Hvis der er blevet trykket på knappen "Login" If Request.Form("Action") = "Login" Then ' Her forberedes de indtastede værdier til validering strUID = Trim(Replace(Request.Form("Brugernavn"),"'","")) strPWD = Trim(Replace(Request.Form("Adgangskode"),"'",""))
' Hvis der er skrevet noget i både brugernavn og adgangskode If Len(strUID) > 0 And Len(strPWD) > 0 Then
' DSNLess forbindelse til databasen Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source=d:\home\dyk\db\Medlemmer.mdb;" ' Opbygning af SQL streng strSQL = "SELECT Medlemsnummer FROM Medlemmer WHERE Fornavn = '" & strUID & "' AND Adgangskode = '" & strPWD & "'" Set rs = myConn.Execute(strSQL) If Not (rs.BOF Or rs.EOF) Then ' Hvis brugeren fandtes i databasen intUID = rs("Medlemsnummer") ' Hvis variablen intUID indeholder en værdi sættes denne i sessionen "UserID" og brugeren bliver sendt videre Session("UserID") = intUID Response.Redirect("lokside.asp") Else ' Hvis brugeren ikke fandtes i databasen strERR = "Den angivne kombination af fornavn og adgangskode findes ikke. Husk at adgangskoden er din fødselsdag Eks.31-12-66 husk bindestregerne mellem tallene. Kontakt evt. Nauticas web-ansvarlige kasserer@dyk-.dk via mail " End If
' Rydder op i vores connection objekt myConn.Close Set myConn = Nothing end if End If %>
' og hvis du vil beholde den oprindelige opsætning så
If Len(intUID) > 0 Then ' Hvis variablen intUID indeholder en værdi sættes denne i sessionen "UserID" og brugeren bliver sendt videre Session("UserID") = intUID Response.Redirect("lokside.asp") End If
prøv den her den her den er næsten 100% sikker medmindre du vil til at køre med md5 kryptering men det er lidt mere langhåret men den her er det bedste du når uden kryptering
--------Login.asp------ //her har du så din login formular
-----Tjek.asp-------- // her tjekker den så om brugern fines i databasen
<% ' her er din database forbinelse så database = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & Request.ServerVariables("APPL_PHYSICAL_PATH") & "database.mdb"
set brugerer = server.CreateObject("ADODB.Recordset") brugerer.open "SELECT * FROM brugerer where Brugernavn = '" & strBrugernavn & "' AND password = '" & strAdgangskode & "'", database
' Hvis brugeren fandtes i databasen If Not (brugerer.BOF Or brugerer.EOF) Then Session("Brugeradgang") = True Response.redirect "beskyttetside.asp"
Else
' Hvis brugeren ikke fandtes i databasen Response.redirect "Login.asp" End If %>
------Beskyt.asp---- //denne fil includer du bare på alle de sider der skal beskyttes <% ' hvis værdien i vores session ikke er lig True så sendes man videre til loginfilen If Session("Brugeradgang") <> True then Response.Redirect "default.asp" End if %>
-------------------------------------------- dette script virker 100% og er rigtigt nemt at lave om og så er det kort
Det forslag som mitbrugernavn kom med kan ikke stoppe den person der kommer igennem koden. Jeg vil prøve det nye forslag, vender tilbage om et par dage.
Hej mitbrugernavn har prøvet at udskifte linien med det du forslår og vil se om det virker i morgen. Hvordan aflæser jeg dette "hvis ikke så tag det brugerne taster ind og smid det i en db så du kan aflæse det" der er jo tilknyttet er db til koden men hvordan kan jeg se hvem der har brugt koden.
Hej igen Det er stadig muligt at omgå koden så hvis der er en der kan skrive et stykke kode så det var muligt at se hvad der bliver indtastet vil det måske kunne hjælpe.
"Husk at adgangskoden er din fødselsdag Eks.31-12-66" Så.....HVOR svært er det lige at gætte en fødselsdag ?? Det må være en ommer - altså hvis man ønsker et sikkert system.
<% ' Hvis der er blevet trykket på knappen "Login" If Request.Form("Action") = "Login" Then ' Her forberedes de indtastede værdier til validering strUID = Trim(Replace(Request.Form("Brugernavn"),"'","")) strPWD = Trim(Replace(Request.Form("Adgangskode"),"'",""))
' Hvis der er skrevet noget i både brugernavn og adgangskode
if strUID <> "" then ok = true if strPWD <> "" then ok = true if ok = true then ' DSNLess forbindelse til databasen Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source=d:\home\dyk\db\Medlemmer.mdb;" ' Opbygning af SQL streng strSQL = "SELECT Medlemsnummer FROM Medlemmer WHERE Fornavn = '" & strUID & "' AND Adgangskode = '" & strPWD & "'" Set rs = myConn.Execute(strSQL) If Not (rs.BOF Or rs.EOF) Then ' Hvis brugeren fandtes i databasen intUID = rs("Medlemsnummer")
strSQL_test = "insert into login_test (brugernavn,adgangskode,medlemsnummer,tid) values ('"&request("Brugernavn)&"','"&request("Adgangskode)&"','"&intUID&"','"&now()&"')" Set rs_test = myConn.Execute(strSQL_test) set rs_test = nothing
' Hvis variablen intUID indeholder en værdi sættes denne i sessionen "UserID" og brugeren bliver sendt videre Session("UserID") = intUID Response.Redirect("lokside.asp") Else ' Hvis brugeren ikke fandtes i databasen strERR = "Den angivne kombination af fornavn og adgangskode findes ikke. Husk at adgangskoden er din fødselsdag Eks.31-12-66 husk bindestregerne mellem tallene. Kontakt evt. Nauticas web-ansvarlige kasserer@dyk-.dk via mail " End If
' Rydder op i vores connection objekt myConn.Close Set myConn = Nothing end if End If %>
opret en tabel der hedder login_test, med følgende kolonner - brugernavn, adgangskode, medlemsnummer, tid - alle sættes til tekstfelter. så kan du se hvem der logger ind - hvornår og med hvad.
har også udskiftet linien hvor den tester for om strUID og strPWD er tom (se koden)
Jeg har rettet din kode til, så den gemmer indtastede brugernavne og adgangskoder: ------------------------------------------------- Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source=d:\home\dyk\db\Medlemmer.mdb;"
myConn.Close Set myConn = Nothing
<%' Hvis der er blevet trykket på knappen "Login" If Request.Form("Action") = "Login" Then ' Her forberedes de indtastede værdier til validering strUID = Trim(Replace(Request.Form("Brugernavn"),"'","")) strPWD = Trim(Replace(Request.Form("Adgangskode"),"'",""))
' Hvis der er skrevet noget i både brugernavn og adgangskode If Len(strUID) <> "" And Len(strPWD) <> "" Then
' DSNLess forbindelse til databasen Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source=d:\home\dyk\db\Medlemmer.mdb;" ' Opbygning af SQL streng strSQL = "SELECT Medlemsnummer FROM Medlemmer WHERE Fornavn = '" & strUID & "' AND Adgangskode = '" & strPWD & "'" Set rs = myConn.Execute(strSQL) If Not (rs.BOF Or rs.EOF) Then ' Hvis brugeren fandtes i databasen intUID = rs("Medlemsnummer") ' Hvis variablen intUID indeholder en værdi sættes denne i sessionen "UserID" og brugeren bliver sendt videre Session("UserID") = intUID
Response.Redirect("lokside.asp") Else ' Hvis brugeren ikke fandtes i databasen strERR = "Den angivne kombination af fornavn og adgangskode findes ikke. Husk at adgangskoden er din fødselsdag Eks.31-12-66 husk bindestregerne mellem tallene. Kontakt evt. Nauticas web-ansvarlige kasserer@dyk-.dk via mail " End If
' Rydder op i vores connection objekt myConn.Close Set myConn = Nothing If Len(intUID) Then ' Hvis variablen intUID indeholder en værdi sættes denne i sessionen "UserID" og brugeren bliver sendt videre Session("UserID") = intUID Response.Redirect("lokside.asp") End If Else ' Hvis der ikke var angivet brugernavn og adgangskode strErr = "Du skal skrive både brugernavn og adgangskode" End If
If Len(strErr) > 0 Then ' Her laves fejlmeddelsen om til rød skrift strErr = "<p><font color=red>" & strErr & "</font></p>" End If End If%> ------------------------------------------- Så når de der kommer ind igen, så tjekker du bare, hvad de har skrevet for at komme ind, og fortæller det her. :)
med mindre login_test er noget meget midlertidigt, så synes jeg da du skulle benytte strUID og strPWD, som du allerede har valideret. Ellers ryger lidt af sikkerheden
Helt fint kan det aldrig blive, at have et hul man kan benytte til at injekte sql. Det kan kompromittere hele databasen, og måske mere til afhængigt af setup
Jeg kan se, at du lægger op til at gemme passwords i klartekst i databasen. Når du så spørger om det kan gøres mere sikkert, så ja: Du bør ikke gemme passwords som klar tekst i databasen. Du bør istedet gemme en værdi beregnet med en ikke reversibel algoritme udfra baggrund af brugerens password. En måde er at benytte SALT og en hashing alogoritme.
Du kan se et eksempel på brug af SALT ved lagring af passwords her (Det er godt nok .NET, men noget tilsvarende må kunne laves i ASP):
Først til jens_klinting det ser rigtig flot ud men jeg kan ikke gennemskue hvordan jeg får min Access database til at virke sammen med dette. Nu til mitbrugernavn eller hvem der kan se hvorfor. Det viser sig nu at der ikke kommer noget fra den person ind i tabellen login_test men det virker fint for alle andre.
det lyder mærkeligt - der bliver jo testet for om indtastningerne er tomme - så lige for en sikkerheds skyld så har du ingen i logindb som er angivet med tomme brugernavn og login
Hvis du mener hvad der er sat ind i brugernavn password medlemsnr tid kolonderen så er det medlemmerne indtaster nemlig deres brugernavn password medlemsnummeret finder den i databasen og så tiden. Men der er slet intet registeret når denne person kommer ind.
Du skal ikke gøre noget specielt i din database for at benytte salt og hashing (udover at sikre dig, at feltet til password er langt nok, da en hashing fylder noget mere end et password i klartekst. Selve beregningen af hash og tjek op imod brugerens password er udelukkende et spørgsmål om kode. Mvh. Jens
Jeg ved ikke om jeg forstår dig rigtig men jeg har en medlemsdatabase i Access og når jeg har rettet i den ligger jeg den op med de nye opdateringer. I databasen er brugernavn og adgangskode og et par andre oplysninger. Uden at vide det ser det ud til at der fra denne kode bliver skrevet til en database fra koden. Jeg kan heller ikke se i hvilken format denne kode skal gennemses i.
hej igen - d.v.s. at der ikke er registreret noget i login_test databasen, heller ikke tid !! måske går personen direkte ind på siderne ???? Har du tjek på alle de side med følgende kode
if Session("UserID") = "" then response.redirect "til din login side" end if
hvis personen ikke har fået tildelt denne session så smides han tilbage til login.
Det er opbygget på den måde at der er en fil protect1.inc det ser således du
<% If isEmpty(Session("UserID")) Then Response.Redirect("../login1.asp")
End If %>
De sider der skal beskyttes er alle *.asp med følgende <!--#include file="../protect1.inc"--> kode i toppen af siden.
Nej der er registreret noget i login_test databasen, heller ikke tid. Det er i første omgang kun en side som vi kan se at der bliver besøgt og den er beskyttet med overstående include fil. Siden er en gæstebog som blev fyldt med spam så vi valte at sætte dette logind på og det hjalp også et stykke tid men så kom han igennem eller uden om koden.
Hej igen Der har ikke været spam indtastninger siden at jeg satte logind på alle formularerne i gæstebogen. Jeg tror at det var formularen ret-gæstebogen som blev kaldt, normal ville man komme til formularen fra admin formularen, gør man det kan man kun rette i indslag der er skreven, men kalder man siden direkte får man en tom formular. Formularen er beskyttet af koden på admin-loging.asp og det er nok den som er blevet knækket. Se den her. Selve koden er selvfølgelig kun et eksempel.
<% Response.Buffer = True
Function ValidateLogin( sId, sPwd ) ' For you to validate ID and PASSWORD ' Maybe against a database ' Here we have hardcoded some OK id:s and passwords ' ValidateLogin = False
If sId = "Kode1" AND sPwd="kode2" Then ValidateLogin = True End If End Function
Dim sText, fBack
fBack = False If Request.Form("dologin") = "yes" Then 'Try to login If ValidateLogin( Request.Form("id"),Request.Form("pwd") ) = True Then 'It is OK!!! 'We are logged in so lets go back to the file that included us fBack = True Session("logonid") = Request.Form("id") Else sText = "Wrong password or user id" End If Else 'We are not trying to login... If Session("logonid") <> "" Then ' fBack = True 'We are logged in so lets go back to the file that included us Else sText = "Please login" End If End If
Tak til alle der har vist interesse for at hjælpe og især tak til mitbrugernavn nu vil det vise sig om det er mulig at bryde koden men lige nu virker det fint.
tak for point - ja, det er lidt frustrerende når man er på jagt ;-)) - men kommer hajen tilbage så må du jo vende tilbage. God weekend.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.