Avatar billede kennedk Nybegynder
16. marts 2007 - 18:10 Der er 25 kommentarer

Første loginscript

hej jeg har lavet mig mit første loginscript. men der er noget jeg ikke forstår :)

<%
Dim strKodeord,strBrugernavn
    if session("brugernavn") <> "" AND session("kodeord") <> "" Then
        dim sessionBrugernavn:sessionBrugernavn = session("brugernavn")
        dim sessionKodeord:sessionKodeord = session("kodeord")
            Logind(sessionBrugernavn, sessionKodeord)
    End if

        function Logind(brugernavn, kodeord)
            dim strLogin
            Set strLogin = Server.CreateObject("ADODB.Recordset")
            strLogin.Open "SELECT COUNT(fldId) AS Antal FROM tblBruger WHERE fldBrugernavn='"&brugernavn&"' AND fldKodeord = '"&kodeord&"'", database
                If strLogin.Fields("Antal") <> 0 Then
                    Session("brugernavn") = brugernavn
                    Session("kodeord") = kodeord
                    strBrugernavn = brugernavn
                    strKodeord = kodeord
                    Logind = true
                Else
                    Logud()
                    Logind = false
                End if
        End function

        Function Logud()
            If Loggetind() = true Then
                Session.Contents.Remove("brugernavn")
                Session.Contents.Remove("kodeord")
                strKodeord = ""
                strBrugernavn = ""
                Logud = true
            Else
                Logud = false
            End if
        End Function

        Function Loggetind()
            if strBrugernavn <> "" AND strKodeord <> "" Then
                Loggetind = true
            Else
                Loggetind = false
            End if
        End Function
%>

jeg får fejlen:
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0414)
Der kan ikke bruges parenteser ved kald af en Sub
/opgave4/loginfunktion.asp, line 6, column 41
Logind(sessionBrugernavn, sessionKodeord)

Er der nogen der kan fortælle mig hvad jeg gør galt?
Avatar billede kennedk Nybegynder
16. marts 2007 - 19:14 #1
Fandt ud af det :)
Det skulle vist bare være:
<%

Dim strKodeord,strBrugernavn
    if session("brugernavn") <> "" AND session("kodeord") <> "" Then
        dim sessionBrugernavn:sessionBrugernavn = session("brugernavn")
        dim sessionKodeord:sessionKodeord = session("kodeord")
            Logind sessionBrugernavn, sessionKodeord
    End if

        Sub Logind(brugernavn, kodeord)
            dim strLogin
            Set strLogin = Server.CreateObject("ADODB.Recordset")
            strLogin.Open "SELECT COUNT(fldId) AS Antal FROM tblBruger WHERE fldBrugernavn = '"&brugernavn&"' AND fldKodeord = '"&kodeord&"'", database
                If strLogin.Fields("Antal") <> 0 Then
                    Session("brugernavn") = brugernavn
                    Session("kodeord") = kodeord
                    strBrugernavn = brugernavn
                    strKodeord = kodeord
                Else
                    Logud()
                End if
        End Sub

        Function Logud()
                Session.Contents.Remove("brugernavn")
                Session.Contents.Remove("kodeord")
                strKodeord = ""
                strBrugernavn = ""
                Logud = true
        End Function

        Function Loggetind()
            if strBrugernavn <> "" AND strKodeord <> "" Then
                Loggetind = true
            Else
                Loggetind = false
            End if
        End Function
%>

Skriv endelig hvis i ser nogle sikkerhedsbrist i koden
Avatar billede keysersoze Ekspert
16. marts 2007 - 19:31 #2
nu ved jeg ikke hvor meget mere kode der er - men kan ikke umiddelbart se noget check for ' tegnet.
Avatar billede Slettet bruger
17. marts 2007 - 12:51 #3
ok... men så skal du replace "'" med ingenting...

altså noget a la dette her:

<%
session("brugernavn")=replace(session("brugernavn"),"'","")
%>

idéen med dette er at fjerne dem sådan at de ingen skade kan gøre - og dette skal selvfølgelig gøres inden dit login-tjek...

\Dan
Avatar billede kennedk Nybegynder
17. marts 2007 - 15:31 #4
Er det bare med sikkerhed til databasen ? :)
Avatar billede Slettet bruger
17. marts 2007 - 19:40 #5
hmm... nej du skal replace "'" med ingenting i dit asp-script i variablerne som indeholder brugernavn og kodeord.

- men prøv lige at forklare mig hvad det er du helt præcist vil med dit login-script... hvordan kan du hente brugernavn og kodeord i sessions? Hvorfor laver du en count i din sql-sætning?

- i bund og grund handler det vel om at der skal laves et asp-script som henter to variabler som fx. hedder "brugernavn" og "kodeord" fra to input-bokse. Dernæst skal disse to gøres til variabler og så skal de variabler redigeres sådan at "'" fjernes. Så skal de to ting slåes op i en tabel i en database - hvor brugernavn og kodeord (variablerne) skal passe til nogle bestemte celler i tabellen. Så skal scriptet afgøre om dette findes i tabellen og hvis det ikke gør skal man komme til en fejlside og hvis det findes skal der sættes en session som man for eksempel kunne knytte til pågældende id i databasen og så skal der viderestilles til forsiden i login-området...

- Er det også det du vil?

sql-eksempel:
sql = "select * from users where username='" & replace(request.form("username"),"'","") & "' and password='" & replace(request.form("password"),"'","") & "'"

\Dan
Avatar billede keysersoze Ekspert
17. marts 2007 - 20:47 #6
som udgangspunkt vil det vel være en dårlig idé at replace ' med ingenting - det vil jo betyde at man ikke kan hedde fx o'donald. Replace i stedet ' med '' (altså 2 ') - og gør det konsekvent ved al database-arbejde.
Avatar billede kennedk Nybegynder
17. marts 2007 - 20:58 #7
:) Jeg er næsten lige startet på asp, så er ikke en haj til der med access database :) jeg kan sagtens sql sætningerne, men jeg har ikke styr på hvordan asp håndterer database oplysningerne
Så jeg ved ikke hvordan man ellers kan tjekke om de ting man vil hente findes, så jeg lavede simpelt en COUNT for at tælle dem :)

Hvordan kan man ellers gøre det?

Og nu har jeg lavet en der har lavet ' til '', og så når(hvis) de skal trækkes ud af databasen så er det jo bare at replace '' med '
Avatar billede Slettet bruger
17. marts 2007 - 21:55 #8
hejsa

- jeg prøver her nedenfor lige at lave et simpelt login-script til dig så:

<%
username = replace(request.form("username"),"'","")
password = replace(request.form("password"),"'","")
set conn = Server.CreateObject("ADODB.Connection")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("users.mdb")
set rs = conn.execute("select * from users where username='" & username & "' and password='" & password & "'")
if rs.EOF then
response.redirect "fejl.asp"
else
session("id") = rs("id")
response.redirect "defaultLogin.asp"
end if
rs.close
set rs=nothing
conn.close
set conn=nothing
%>

well... det er ikke 100% sikkert det her. Men hvis du så på loginsiderne laver et tjek på om sessionen "id" eksisterer i toppen af siden, kan man ikke være inde på de sider uden at være logget ind. Men du bør nok overveje hvordan det skal kunne lade sig gøre at lave det sådan at man ikke kan downloade databasen - eller i det mindste køre noget kryptering som for eksempel md5 eller lignende... eller måske gøre begge dele...

\Dan
Avatar billede keysersoze Ekspert
17. marts 2007 - 22:05 #9
nej - sådan foregår det ikke helt. Når du indsætter skal du replace ' med '' - men der vil stadig kun blive indsat en '. Derfor vil du heller ikke skulle replace '' ved udtræk.
Avatar billede kennedk Nybegynder
17. marts 2007 - 23:27 #10
bare tjekke om den er EOF :) nu har jeg det på plads
men kan man få udskrivevet antallet af rækker uden at lave en COUNT?
Avatar billede Slettet bruger
18. marts 2007 - 02:58 #11
Hejsa

EOF står for "end of file"... og er nok den mest rigtige måde at gøre dette her på...

Hvis du ville lave en optælning af rækker i databasen skal du lave et loop først...
- men det har jo ikke så meget med login-scriptet at gøre så. Den finder jo forhåbentlig ikke mere end én (eller ingen) række når man skal logge ind.

- men hvis du vil lave en optælning kunne det se sådan her ud:

<%
set conn = Server.CreateObject("ADODB.Connection")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
set rs = conn.execute("select * from tabel")
if rs.EOF then
count=0
else
do until rs.EOF
count=count+1
rs.movenext
loop
end if
rs.close
set rs=nothing
conn.close
set conn=nothing
response.write "Der blev fundet " & count & " række(r) i databasen"
%>

\Dan
Avatar billede kennedk Nybegynder
18. marts 2007 - 04:17 #12
okay :) Jeg siger tak mange gange :)
Det er altid rart med noget hjælp/kritik

Send svar Dan :)
Avatar billede ksoren Nybegynder
18. marts 2007 - 04:22 #13
Så mangler vi bare en konkret eksempel på, hvorfor apostroffer er så farlige. Du kan google lidt på sql injection, og få lidt mere info om emnet
Avatar billede keysersoze Ekspert
18. marts 2007 - 09:55 #14
http://activedeveloper.dk/articles/55/

... fordi man ellers kan fx logge ind uden at have et egentligt brugernavn/password - ved ikke hvor meget på kant med reglerne det er at give et egentligt eksempel så jeg vil hellere lade være.
Avatar billede Slettet bruger
18. marts 2007 - 13:16 #15
OK.

Her et svar...

Og ja! Tro mig jeg ved godt at ' er farlige at tillade - men jeg er ikke enig med keysersoze i at løsningen er at erstatte dem med ".
Min mening er at det er bedre at erstatte dem med ingenting - og så selvfølgelig heller ikke tillade dem når folk tilmelder sig dit login-område...

- men sådan kan vi jo være så forskellige...

\Dan
Avatar billede keysersoze Ekspert
18. marts 2007 - 13:24 #16
dannielsen >> så med andre ord vil du ikke tillade at folk kan hedde fx o'donnald eller at brugerne kan skrive tekster med fx "en mus' snude er meget lille"? Du skal jo stadig tænke på at det du foretager dig reelt set er en omskrivning af brugerens input og det _kan_ få store betydningskonsekvenser - når man replacer en enkelt pling med to enkeltplinger vil der jo aldrig blive sat to plinger ned i databasen eftersom den ene bare escaper den anden? Hvad er det du er bange for?
Avatar billede Slettet bruger
18. marts 2007 - 13:41 #17
Hej Keysersoze

- Uden at vi to her skal igang med en større debat om hvad man skal gøre ved sql-injections - så vil jeg nu alligevel sige at det her er et loginscript vi har med at gøre her - og hvis man skulle erstatte ' med " så ville den jo så heller ikke kunne kende forskel på de to tegn i udtrækket. Dette ville nok ikke være så stort et problem når der er tale om et login-script. Men hvis der for eksempel var tale om en gæstebog eller søgemaskine eller lignende ville jeg da synes at det var et stort problem at systemet ikke kan kende forskel på de to vidt forskelligtbedydende tegn.

- så ville det måske være bedre at erstatte ' med ´ (den tast til venstre for backspace) - de to tegn ligner hinanden i sin betydning...

- Men ellers så ja! Så ville jeg ikke tillade en o'donald at hedde o'donald... På samme måde ville jeg nok heller ikke tillade sådan noget som mellemrum i brugernavn og kodeord. Dem ville jeg også fjerne. Men selvfølgelig ikke uden at brugeren ved det ved tilmelding. Det skal enten en validering sørge for eller også skal brugeren gøre stærkt opmærksom på det ved tilmelding...

\Dan
Avatar billede keysersoze Ekspert
18. marts 2007 - 13:57 #18
dannielsen >> tænk - jeg har altid troet at dit efternavn var dannielsen og ikke at det var en sammentrækning af dit navn "dan nielsen" :)

Jeg synes faktisk at diskutionen er ret relevant for jeg mener det du siger er forkert. Du kan sagtens lave en sammenligning på pling - uanset om vi taler ganske almindelig tekst eller som her brugernavn/password. Lad os sige at jeg har brugernavn/password = o'donald/1234'4321 så vil min sql måske se sådan ud;

SQL = "SELECT COUNT(id) FROM users WHERE username = '" & Replace(Request.Form("username"),"'","''") & "' AND pass = '" & Replace(Request.Form("pass"),"'","''") & "'"

Og det vil fungere uden problemer - simpelthen fordi den dobbeltpling der ren visuelt vil komme reelt set vil fungere sådan at den ene pling vil escape den anden og, hvis jeg ellers har tastet rigtigt i mine to forms, vil jeg blive logget ind selvom jeg har dette underlige brugernavn/password.

Min kommentar går ikke på hvad jeg vil tillade brugere eller ej - personligt vil jeg tillade dem alt og aldrig modificere brugerens input (heller ikke erstatning af ' med ´) da det slet ikke er nødvendigt - men jeg mener at det du siger er forkert og derfor ikke bør læres af andre.
Avatar billede keysersoze Ekspert
18. marts 2007 - 13:59 #19
og nu jeg gennemlæser din seneste post igen lægger jeg mærke til hvorfor du måske misforstår - jeg vil ikke erstatte ' med " men derimod erstatte ' med ''. Eller med ord; jeg vil ikke erstatte enkeltpling med dobbeltpling men derimod erstatte enkeltpling med 2 enkeltplinger.
Avatar billede Slettet bruger
18. marts 2007 - 14:02 #20
arh... Okay Keysersoze. Der har du egentlig ret... Dette vil altså sige at o'donald kommer til at hedde o''donald i databasen.

- Jamen din idé er ok - men så SKAL man bare huske ALTID at replace det tilbage igen ved udtræk...

Men den havde jeg ikke lige tænkt på - takker!

\Dan
Avatar billede keysersoze Ekspert
18. marts 2007 - 14:10 #21
nejnejnej! (undskyld udtrykket)

Når du replacer ' (pling) med '' (to enkeltplinger) i din SQL vil det stadig kun blive opfattet som en '. Så hvis du i et formfelt skriver "o'donald" og din SQL ser sådan ud;

SQL = "INSERT INTO tabel (name) VALUES ('" & Replace(Request.Form("name"),"'","''") & "')"

Så vil værdien i databasen være "o'donald" og ikke "o''donald" og du skal derfor ikke replace noget som helst når værdien skal vises igen - og du vil stadig kunne sammenligne uden problemer;

SQL = "SELECT id FROM tabel WHERE name = '" & Replace(Request.Form("name"),"'","''") & "'"

Så alt der skal tages højde for af brugerinput er ' - og den klares altså ved at replace som beskrevet - og ved udtræk fra databasen skal der ingen forbehold tages andet en måske bare en server.htmlencode så ikke der ligger farlig js eller lignende i databasen.
Avatar billede Slettet bruger
18. marts 2007 - 14:15 #22
hmm... ok!

- så lærte jeg også noget i dag Keysersoze! Jeg tog fejl med min påstand - og du rettede mig. Tak skal du have!

- men sådan kan vi vel alle tage fejl engang i mellem...

Hav en fortsat god søndag!

\Dan
Avatar billede Slettet bruger
18. marts 2007 - 14:22 #23
hehe... men man kunne vel egentlig også bare kryptere det hele til for eksempel md5 eller lignende når vi taler om login-tilmelding så er vi vel også ude over det problem med sql-injections...?

\Dan
Avatar billede keysersoze Ekspert
18. marts 2007 - 14:29 #24
nja - for du vil somregel kun kryptere password og ikke brugernavn da brugernavnet mange gange skal bruges senere i systemet og MD5 er (som udgangspunkt) envejs.
Avatar billede keysersoze Ekspert
07. april 2007 - 16:42 #25
lukketid?
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