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?
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
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"),"'","") & "'"
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.
:) 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 '
Synes godt om
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...
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.
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?
Synes godt om
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" %>
... 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.
Synes godt om
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...
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?
Synes godt om
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...
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.
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.
Synes godt om
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...
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;
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.
Synes godt om
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
Synes godt om
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...?
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.
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.