Avatar billede jan2001 Nybegynder
17. juli 2007 - 11:23 Der er 18 kommentarer og
1 løsning

undgå sql injektioner

Har kigget rundt på nettet for at finde noget om beskyttelse mod injektioner i sql-strenge, men fandt ikke noget jeg kunne få noget ud af.
Jeg kan dog forstå at jeg skal bruge addslashes, stripslashes, replace samt sql parameters.

Men hvad er sql parameters?

Jeg mangler nogle simple eksempler på brug af ovenstående fx. i et login-script.
Avatar billede hehlers Nybegynder
17. juli 2007 - 11:58 #1
Du kan evt. bare tjekke din form for ' ved hjælp af:

usr = request.form("usr")
pwd = request.form("pwd")

if instr(usr,"'") then
  Response.Redirect("login.asp?etx=Forkert login")
end if

if instr(pwd,"'") then
  Response.Redirect("login.asp?etx=Forkert login")
end if
Avatar billede jan2001 Nybegynder
17. juli 2007 - 13:09 #2
kan det lade sig gøre at tjekke for flere i samme instr(). Det kunne vel tænkes at nogen kunne finde på at bruge html-kode eller ascii eller hex osv i steden for '.
Avatar billede windcape Praktikant
17. juli 2007 - 13:11 #3
Avatar billede madeindk Nybegynder
17. juli 2007 - 15:31 #4
Det gør ingen ting hvis folk forsøger at bruge et alternativ til ' - det skal være det tegn før det fucker den op.

Men jeg plejer altid at gøre sådan her - synes jeg ligeså godt man, der er ingen grund til at tjekke om tegnet indgår. Det er bare at replace det.

<%
strBrugernavn = Trim(Replace(Request.Form("usr"),"'",""))
strAdgangskode = Trim(Replace(Request.Form("pwd"),"'",""))

If strBrugernavn <> "" AND strAdgangskode <> "" Then
  ' Tjek i databasen
Else
  ' Intet udfyldt
End If
%>

Det er klart måden at gøre det på - læs mere om SQL injection her: http://www.opfinderen.dk/sites/15/
Avatar billede hifi4all Nybegynder
17. juli 2007 - 15:51 #5
Har skrevet lidt om det her, måske det kan benyttes?:
http://blog.zonedesign.dk/?page=a&aid=31
Avatar billede windcape Praktikant
20. juli 2007 - 04:29 #6
"Det gør ingen ting hvis folk forsøger at bruge et alternativ til ' - det skal være det tegn før det fucker den op."
Og hvad hvis jeg bruger ASCII værdien? :)
Avatar billede jan2001 Nybegynder
20. juli 2007 - 10:22 #7
hifi4all: det er en god guide du henviser til. Men stdag, hvad hvis der bruges tegnkoder?
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 10:26 #8
madeindk 17/07-2007 15:31:52 "Det er klart måden at gøre det på" <---- NEJ - Det er helt klart vigtigt at kunne håndtere alle tegn, brugeren taster ind, så de gemmes i databasen og vises igen. Det er kun rene amatører, der smider tegn væk, som de ikke ka' li. :)
Avatar billede hifi4all Nybegynder
20. juli 2007 - 16:42 #9
Quote[hifi4all: det er en god guide du henviser til. Men stdag, hvad hvis der bruges tegnkoder?]

Jeg er ikke helt sikker på hvad du mener med tegnkoder, men som jeg omtaler i min lille hjemmebryggede artikel, så replacer/erstatter jeg "uønskede" tegn til noget andet, og du kunne i princippet så opfinde dine egen parameter for f.eks. tegnet '

Eks: strInputEntry = Replace(strInputEntry, "'", "jds8734js93j3", 1, -1, 1)

Du er dit tegn ('), omsat til tekststrengen "jds8734js93j3", og kan uden videre , og sikkert, gemmes i din database.

Når du så igen vil udskrive data fra databasen, virker det jo ikke så fikst, at der står "jds8734js93j3", når det er tegnet (') vi gerne vil se igen, men så kan du lave tilsvarende ovenstående funktion. Altså en slags re-formateringsf unktion, alla sådan her:

'Re-formater mine erstattede specialtegn
Private Function ReFormatSpecialTegn(ByVal strInputEntry)

strInputEntry = Replace(strInputEntry, "uha_det_farlige_tegn", "'", 1, -1, 1)

ReFormatSpecialTegn = strInputEntry
End Function

Lidt bøvlet, og ret omfattende, hvis der er mange specialtegn, men det virker.
Avatar billede jan2001 Nybegynder
20. juli 2007 - 22:34 #10
Jeg tæmke bare, hvis nu man bruger 39 eller &#39; i steden for '. Vil serveren eller browseren ikke oversætte koderne til ' ?

erikjacobsen: hvorfor skulle det være amatøragtigt at smide tegn væk. Det kan jo være at en fx. en querystring skal indeholde et præcis værdi for at scriptet virker.

Man har da vel også lov at dikterer hvilke tegn brugeren må bruge fx. kun tal og alfabetet. Vel mest for brugerens egen skyld for bedre at kunne huske koden.
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 22:48 #11
Hvis han hedder "O'Reilly" og ikke må skrive "'", så har du en sur kunde.

Der er ingen grund til alle de krumspring. Gem data i tabeller med een af disse:
1) prepared-statements/parameters - kært barn har mange navne
2) Lær hvilke tegn, der skal escapes og hvordan. Nemt og elegant.

Det er latterligt og amatøragtigt at smide tegn væk i SQL, eller at erstatte med "jds8734js93j3".
Avatar billede arne_v Ekspert
20. juli 2007 - 23:10 #12
parameters er langt det nemmeste, sikreste og mest portable !
Avatar billede jan2001 Nybegynder
20. juli 2007 - 23:22 #13
hvad er så parameters?
Avatar billede arne_v Ekspert
20. juli 2007 - 23:43 #14
Der er et eksempel i windscapes link.
Avatar billede arne_v Ekspert
20. juli 2007 - 23:44 #15
Et eksempel fra lageret:

<%
' open
adParamInput = 1
adInteger = 3
adVarChar = 200
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
' traditionel
con.Execute "INSERT INTO t1 VALUES(7,'O''Toole')"
' med parameters
cmd.CommandText = "INSERT INTO t1 VALUES(@f1,@f2)"
cmd.Parameters.Append(cmd.CreateParameter("@f1", adInteger, adParamInput))
cmd.Parameters.Append(cmd.CreateParameter("@f2", adVarChar, adParamInput, 50))
cmd.Parameters("@f1") = 8
cmd.Parameters("@f2") = "O'Malley"
cmd.Execute
' close
Set cmd = Nothing
Set con = Nothing
%>
OK
Avatar billede arne_v Ekspert
20. juli 2007 - 23:44 #16
Et andet:

<%
' open
adParamInput = 1
adInteger = 3
adDate = 7
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
' lige ud af landevejen
con.Execute "INSERT INTO params(id,tid) VALUES(1,'7-JUN-2005')"
' med kommando
cmd.CommandText = "INSERT INTO params(id,tid) VALUES(2,'8-JUN-2005')"
cmd.Execute
' med kommando og parametre
cmd.CommandText = "INSERT INTO params(id,tid) VALUES(@id,@tid)"
cmd.Parameters.Append(cmd.CreateParameter("@id", adInteger, adParamInput))
cmd.Parameters.Append(cmd.CreateParameter("@tid", adDate, adParamInput))
cmd.Parameters("@id") = 3
cmd.Parameters("@tid") = CDate("9-JUN-2005")
cmd.Execute
' close
Set cmd = Nothing
Set con = Nothing
%>
OK
Avatar billede arne_v Ekspert
20. juli 2007 - 23:44 #17
(eksemplerne er med Access men metoden kan også bruges med SQLServer og MySQL)
Avatar billede jan2001 Nybegynder
21. juli 2007 - 01:36 #18
Det var dog en hulens masse kode. Har prøvet at tygge mig igennem, men det er helt nyt for mig. Findes der ikke en tutorial, som skærer det ud i pap.
Avatar billede windcape Praktikant
21. juli 2007 - 18:29 #19
Hvad med at læse dokumentationen for ADODB på MSDN ? Tror den forklare det bedst :-)

Men du _SKAL_ kunne forstå engelsk dokumentation!
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