Avatar billede Slettet bruger
13. november 2006 - 10:24 Der er 8 kommentarer og
1 løsning

Sikkerhed i login script

Nedenstående script fungerer tildels som det skal.
<%Response.Buffer = "True"
Session.lcid = 1053

db = Server.MapPath("/data/databas.mdb")

Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db

If Request.Querystring("adgangskode") = "nej"  Then
  mess = "alert('Forkert adgangskode');return true;"
End If

If Request.Querystring("bruger") = "nej"  Then
  mess = "alert('Brugeren findes ikke!');return true;"
End If

If Request.Querystring("bruger2") = "tom"  Then
  mess = "alert('Du skal skrive et brugernavn');return true;"
End If

If Request.Querystring("omraadet") = "nej"  Then
  mess = "alert('Du har ikke adgang til dette felt');return true;"
End If
%>

<html>
<head>
<title>LogindKN</title>
<link rel="stylesheet" href="style1.css" type="text/css">
<LINK HREF="style1.css" REL="STYLESHEET" TYPE="text/css">
<script src="js/js.js"></script>
</head>

<body bgcolor="#f0f0f0" OnLoad="<%=mess%>">

<%If Request.Querystring("visa")="" Then%>

<table width="400">
  <tr>
      <td colspan="2"><b>Log ind</b></td>
  </tr>

  <form name="login" method="post" action="cv.asp?visa=check" target="_parent">
  <tr>
      <td>Brugernavn</td><td><input type="text" name="admin1" size="35"></td>
  </tr>
  <tr>
      <td>Adgangskode</td><td><input type="password" name="admin2" size="35"></td>
  </tr>
  <tr>
 
  <td colspan="2" align="center">
  <select name="omraadet" style="width: 150">
  <%           
  SQL = "Select * From felt order by omraadeNavn "
  RS.Open SQL, Conn
Do While Not RS.EOF
Response.Write "<b>"%><option><%=RS("omraadeNavn")%> </option> </b>
  <%    RS.MoveNext
    Loop
  %>
  </select>
</td> 
</tr>
  <tr>
      <td>&nbsp;</td><td>
      <input type="submit" value="Ok"></td>
  </tr>
  </form>
</table>

<%End If

If Request.Querystring("visa")="check" Then
    Set RecSet=Conn.Execute("Select * From users where brugernavn='" & Request.Form("admin1") & "'")
    Response.Cookies("user") = Request.Form("user")

    If Not RecSet.EOF Then
      If Request.Form("admin2") = RecSet("adgangskode") Then
            login="ok"
      Else
          Response.Redirect "cv.asp?adgangskode=nej"   
      End If
     
        If Request.Form("admin1") = RecSet("brugernavn") Then
            login="ok"
      Else
          Response.Redirect "cv.asp?bruger=nej"   
    End If
   
    If Request.Form("omraadet") = RecSet("omraade") Then
            login="ok"
    Else
      Response.Redirect "cv.asp?omraadet=nej"   
End if
                 
    If login="ok" Then
      Session("login") = "ok"     
      Session("user") = Request.Form("admin1")
      Session.TimeOut = 40
      Response.Redirect RecSet("link")
      End If
  End If
End if
%>
</body>
</html>

Men hvor sikkert er det. Jeg har læst noget om at man kan komme "forbi" ved at anvende "and" og "or" i .asp
Avatar billede fennec Nybegynder
13. november 2006 - 11:02 #1
Du har ikke sikret dig mos SQL injections.

Ved at skrive "' or '1'='1" (uden " tegne), bliver din sql til:
Set RecSet=Conn.Execute("Select * From users where brugernavn='' or '1'='1'")

De skal så kun gætte passwordet. Det klare du ved at erstatte ' med 2. Også kan du lige så godt smide passwordet på sql'en:

user = replace(Request.Form("admin1"),"'","''")
pass = replace(Request.Form("adgangskode"),"'","''")
omraade = replace(Request.Form("omraade"),"'","''")
Set RecSet=Conn.Execute("Select * From users where brugernavn='" & user & "' and adgangskode='"& pass &"' and omraade='"& omraade &"'")
if not RecSet.eof then
  login="ok"
else
  Response.Redirect "cv.asp?err=loginfejl"
end if

En del af sikkerheden ligger nemlig også i at man ikke kan gætte sig frem til et rigtig brugernavn, derfra til et password og i dette tilfælde derfra til et område.
Avatar billede fennec Nybegynder
13. november 2006 - 11:12 #2
Med din tidligere kode kunner jeg bare begynde at taste brugernavne indtil jeg fik "adgangskode=nej". Så har jeg fået et brugernavn. Derefter fortsætter jeg med password osv.

Du kan samtidig lave et "kommer fra" tjek med:
Request.ServerVariables("HTTP_REFERER")

Den kan du sammenligne med dit eget domæne/side, ellers kan jeg lave en side på mit eget domæne, også logge ind herfra. Det kan jeg selvfølgelig automatisere, da det er min egen kode, så jeg kan autogenerere user/pass indtil jeg får et hit. Med HTTP_REFERER kan du lukke for det også:

if Request.ServerVariables("HTTP_REFERER") = "http://ditdomæne.dk/loginside.asp" then
  'OK
else
  'Fra anden side. FEJL FEJL FEJL
end if
Avatar billede Slettet bruger
13. november 2006 - 11:13 #3
Tak. Ser på det med det samme.
Men når jeg kører scriptet lokalt (iis) fungerer det fint mens jeg får fejlen:
HTTP 500 - Intern serverfejl
Internet Explorer
når det afvikles på udbyderens server
Det er lidt mystisk og har vel ikke noget med scriptet at gøre?
Avatar billede Slettet bruger
13. november 2006 - 12:11 #4
Det kan jeg ikke gennemskue fennec:
<%Response.Buffer = "True"
Session.lcid = 1053
db = Server.MapPath("/data/databas.mdb")
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db
%>
<html>
<head>
<title>LogindKN</title>
<link rel="stylesheet" href="style1.css" type="text/css">
<LINK HREF="style1.css" REL="STYLESHEET" TYPE="text/css">
<script src="js/js.js"></script>
</head>
<body bgcolor="#f0f0f0">

<table width="400">
  <tr>
      <td colspan="2"><b>Log ind</b></td>
  </tr>

  <form name="login" method="post" target="_parent">
  <tr>
      <td>Brugernavn</td><td><input type="text" name="admin1" size="35"></td>
  </tr>
  <tr>
      <td>Adgangskode</td><td><input type="password" name="admin2" size="35"></td>
  </tr>
  <tr>
 
  <td colspan="2" align="center">
  <select name="omraadet" style="width: 150">
  <%           
  SQL = "Select * From felt order by omraadeNavn "
  RS.Open SQL, Conn
Do While Not RS.EOF
Response.Write "<b>"%><option><%=RS("omraadeNavn")%> </option> </b>
  <%    RS.MoveNext
    Loop
  %>
  </select>
</td> 
</tr>
  <tr>
      <td>&nbsp;</td><td>
      <input type="submit" value="Ok"></td>
  </tr>
  </form>
</table>

<%
user = replace(Request.Form("admin1"),"'","''")
pass = replace(Request.Form("admin2"),"'","''")
omraade = replace(Request.Form("omraadet"),"'","''")
Set RecSet=Conn.Execute("Select * From users where brugernavn='" & user & "' and adgangskode='"& pass &"' and omraade='"& omraade &"'")
if not RecSet.eof then
  login="ok"
else
  Response.Redirect "cv.asp?err=loginfejl"
end if
If login="ok" Then
Response.Redirect RecSet("link")

End if
%>
</body>
</html>

Jeg får det ikke til at virke lokalt på iis.
Det virker som der køres en uendelig løkke
Avatar billede fennec Nybegynder
13. november 2006 - 13:12 #5
Du mangler en action for <form> og et request.querystring tjek:

<%Response.Buffer = "True"
Session.lcid = 1053
db = Server.MapPath("/data/databas.mdb")
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db
%>
<html>
<head>
<title>LogindKN</title>
<link rel="stylesheet" href="style1.css" type="text/css">
<LINK HREF="style1.css" REL="STYLESHEET" TYPE="text/css">
<script src="js/js.js"></script>
</head>
<body bgcolor="#f0f0f0">

<form name="login" action="cv.asp?visa=check" method="post" target="_parent">
<table width="400">
  <tr>
      <td colspan="2"><b>Log ind</b></td>
  </tr>
  <tr>
      <td>Brugernavn</td><td><input type="text" name="admin1" size="35"></td>
  </tr>
  <tr>
      <td>Adgangskode</td><td><input type="password" name="admin2" size="35"></td>
  </tr>
  <tr>
 
  <td colspan="2" align="center">
  <select name="omraadet" style="width: 150">
  <%           
  SQL = "Select * From felt order by omraadeNavn "
  RS.Open SQL, Conn
Do While Not RS.EOF
Response.Write "<b>"%><option><%=RS("omraadeNavn")%> </option> </b>
  <%    RS.MoveNext
    Loop
  %>
  </select>
</td> 
</tr>
  <tr>
      <td>&nbsp;</td><td><input type="submit" value="Ok"></td>
  </tr>
</table>
</form>

<%
If Request.Querystring("visa")="check" Then
    user = replace(Request.Form("admin1"),"'","''")
    pass = replace(Request.Form("admin2"),"'","''")
    omraade = replace(Request.Form("omraadet"),"'","''")
    Set RecSet=Conn.Execute("Select * From users where brugernavn='" & user & "' and adgangskode='"& pass &"' and omraade='"& omraade &"'")
    if not RecSet.eof then
        Response.Redirect RecSet("link")
    else
        Response.Redirect "cv.asp?err=loginfejl"
    end if
End if
%>
</body>
</html>
Avatar billede Slettet bruger
13. november 2006 - 13:30 #6
Rigtigt. Mange tak for hjælpen.
Jeg er dog lidt ked af at miste orienteringen for brugeren om hvad det er der indtastes forkert.
Har du mod på det forhøjer jeg gerne p. for arbejde videre med dette login så der er en sammenhæng. Ellers opretter jeg blot et nyt sp.
Men sender du et svar
Avatar billede fennec Nybegynder
13. november 2006 - 13:47 #7
Hvis du vil bibeholde dit gamle meddelingssystem, kan det bruges som det var. Så er det kun user, du skal sikre mod SQL injections:

If Request.Querystring("visa")="check" Then
    user = replace(Request.Form("admin1"),"'","''")
    Set RecSet=Conn.Execute("Select * From users where brugernavn='" & user & "'")
    Response.Cookies("user") = Request.Form("user")
    If Not RecSet.EOF Then
    If Request.Form("admin2") = RecSet("adgangskode") Then
    login="ok"
    Else
        Response.Redirect "cv.asp?adgangskode=nej"
    End If
   
    If Request.Form("admin1") = RecSet("brugernavn") Then
        login="ok"
    Else
        Response.Redirect "cv.asp?bruger=nej"
    End If
   
    If Request.Form("omraadet") = RecSet("omraade") Then
        login="ok"
    Else
        Response.Redirect "cv.asp?omraadet=nej"
    end if
    If login="ok" Then
        Session("login") = "ok"
        Session("user") = Request.Form("admin1")
        Session.TimeOut = 40
        Response.Redirect RecSet("link")
        End If
    End If
End if
Avatar billede Slettet bruger
13. november 2006 - 14:23 #8
Men herved går jeg også glip af den øgede sikkerhed så vidt jeg kan se/forstå.
Så laver jeg den sådan:
if not RecSet.eof then
        Response.Redirect RecSet("link")
    else
        Response.Redirect "fejlLogin.asp?err=loginfejl"
    end if
og tilføjer teksten: "Du har angivet forkerte oplysninger eller har ikke rettigheder til at se området. Prøv igen."
Men det kunne være smart nok at få det i et popup vindue.
Det må jeg kunne finde ud af
Men mange tak for hjælpen
Avatar billede fennec Nybegynder
13. november 2006 - 14:49 #9
Du går ikke glip af øget sikkerhed med det forige script. Databasen kan ikke hackes via sql injections.

Tabet af sikkerhed består i at det bliver nemmere at gætte sig frem til adgang i systemet, fordi man får at vide hvad der er forkert, og derfor også at man har gættet sig frem til et rigtigt brugernavn. Når man har fundet det, kan man gå igang med at gætte passwordet.
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