Avatar billede pouls Juniormester
21. maj 2007 - 23:54 Der 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
%>
Avatar billede mitbrugernavn Praktikant
22. maj 2007 - 11:03 #1
' prøv dette

<%
' 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
%>
Avatar billede mitbrugernavn Praktikant
22. maj 2007 - 11:05 #2
' 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
Avatar billede pouls Juniormester
22. maj 2007 - 12:41 #3
Har prøver at indsætte den nye tekst og vil se om det er nok til at holde disse mensker ude på forhånd tak. Vil vende tilbage om et par dage.
Avatar billede icedox Nybegynder
22. maj 2007 - 18:50 #4
strUID = Trim(Replace(Request.Form("Brugernavn"),"'",""))
strPWD = Trim(Replace(Request.Form("Adgangskode"),"'",""))

' skal Replace med '' så er den sikker.
Avatar billede mitbrugernavn Praktikant
22. maj 2007 - 21:43 #5
;-)))

prøv at læse koderne - det er det der startes med.
Avatar billede mikkelnh Nybegynder
22. maj 2007 - 22:33 #6
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

<form method="POST" action="Tjek.asp">
    <input type="text" name="Brugernavn" value="Brugernavn"/><br />
    <input type="password" name="Adgangskode" value="Password"/><br />
    <input type="submit" value="Login" /><br />
</form>

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

Dim strBrugernavn, strAdgangskode
strBrugernavn = Trim(Replace(request.form("Brugernavn"),"'","''" ))
strAdgangskode = Trim(Replace(request.form("Adgangskode"),"'","''" ))

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
Avatar billede pouls Juniormester
23. maj 2007 - 09:57 #7
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.
Avatar billede mitbrugernavn Praktikant
23. maj 2007 - 10:23 #8
'
prøv at skifte denne linie

  If Len(strUID) > 0 And Len(strPWD) > 0 Then
med denne
  If trim(strUID) <> "" And trim(strPWD) <> "" Then

ved du hvordan personen kommer ind  ??

hvis ikke så tag det brugerne taster ind og smid det i en db så du kan aflæse det
Avatar billede pouls Juniormester
23. maj 2007 - 12:26 #9
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.
Avatar billede pouls Juniormester
26. maj 2007 - 01:33 #10
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.
Avatar billede erikjacobsen Ekspert
26. maj 2007 - 01:40 #11
"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.
Avatar billede pouls Juniormester
26. maj 2007 - 07:45 #12
Eks. læses eksempel
Avatar billede mitbrugernavn Praktikant
26. maj 2007 - 08:40 #13
<%
' 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)
Avatar billede w13 Novice
26. maj 2007 - 08:45 #14
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

        rs.Close

        'Gemmer oplysninger i testlogin i databasen
            strSQL = "SELECT * FROM [testlogin]"
        rs.Open strSQL, strDSN, 2, 2
        rs.AddNew
        [brugernavn] = '" & strUID & "'
        [password] = '" & strPWD & "'"
        rs.Update
        rs.Close

            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. :)
Avatar billede w13 Novice
26. maj 2007 - 08:45 #15
Okay, der var du lige lidt hurtigere :P
Avatar billede pouls Juniormester
26. maj 2007 - 20:12 #16
hej jeg brugte mitbrugernavn forslag men får denne fejl

Microsoft VBScript compilation error '800a03ee'

Expected ')'

/login1.asp, line 95

strSQL_test = "insert into login_test (brugernavn,adgangskode,medlemsnummer,tid) values ('"&request("Brugernavn)&"','"&request("Adgangskode)&"','"&intUID&"','"&now()&"')"
Avatar billede w13 Novice
26. maj 2007 - 20:43 #17
request("Adgangskode) mangler et ". :)
Altså:
request("Adgangskode")
Avatar billede morhan Novice
26. maj 2007 - 20:46 #18
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
Avatar billede w13 Novice
26. maj 2007 - 21:21 #19
login_test skulle pouls bare bruge til at se, hvad folk indtaster ved login, så det er fint nok.
Avatar billede morhan Novice
26. maj 2007 - 21:29 #20
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
Avatar billede pouls Juniormester
26. maj 2007 - 22:36 #21
Der var en fejl mere i ("Brugernavn)&" men nu virker det fint, så nu er det bare at vente mange tak.
Avatar billede mitbrugernavn Praktikant
27. maj 2007 - 07:21 #22
det må du undskylde - men kan se at du har fået det rettet - ;-))) ja så er det bare at vente på at den store haj går i nettet.
Avatar billede jens_klinting Nybegynder
27. maj 2007 - 08:29 #23
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):

http://msdn2.microsoft.com/en-us/library/aa288534(VS.71).aspx

Mvh.
Jens
Avatar billede jens_klinting Nybegynder
27. maj 2007 - 08:32 #24
Ups, der indsneg sig vist en typo.

'udfra baggrund af brugerens password' -> 'udfra brugerens password'

:o)
Avatar billede pouls Juniormester
28. maj 2007 - 09:25 #25
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.
Avatar billede mitbrugernavn Praktikant
28. maj 2007 - 10:18 #26
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
Avatar billede mitbrugernavn Praktikant
28. maj 2007 - 10:20 #27
hvad er der sat ind i login_test i kolonnerne brugernavn password medlemsnr tid ???
Avatar billede pouls Juniormester
28. maj 2007 - 10:47 #28
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.
Avatar billede jens_klinting Nybegynder
28. maj 2007 - 11:54 #29
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
Avatar billede pouls Juniormester
28. maj 2007 - 12:31 #30
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.
Avatar billede mitbrugernavn Praktikant
28. maj 2007 - 19:14 #31
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.
Avatar billede pouls Juniormester
28. maj 2007 - 21:28 #32
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.
Avatar billede morhan Novice
28. maj 2007 - 21:57 #33
den side formen på gæstebogen bliver submitted til, er den også beskyttet?
Avatar billede pouls Juniormester
28. maj 2007 - 23:29 #34
der var en asp side der ikke var beskyttet. Måske det kan være årsagen men det er den nu.
Avatar billede pouls Juniormester
30. maj 2007 - 23:07 #35
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

If fBack = False Then %>
Avatar billede pouls Juniormester
31. maj 2007 - 22:31 #36
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.
Avatar billede mitbrugernavn Praktikant
02. juni 2007 - 09:04 #37
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester