Avatar billede EveryMA Mester
06. juli 2014 - 23:42 Der er 25 kommentarer

'isNumeric' = beskyt for sql-injection

Hej.
Jeg ved hvordan man laver et sql-kald der er åben for injections og jeg kan læse mig til, at der ikke findes én metode, der lukker ned for det hele på én gang. Der er mange måder at manipulere med sql-kaldet på og her skal man lukke hver enkel metode.

Af den grund vil jeg høre, om funktionen isNumeric ikke er en logisk måde at lukke ned for det på? Se eksempel:

id = request.querystring("id")
if not isNumeric(id) then
response.redirect("tilbage til forsiden fordi id ikke er rent tal")
end if
sql = "select * from tabel where id = " & id & ""

Er det ikke logik, at man IKKE kan komme fordi den stump kode, der tjekker om (id) er tal? Eller er der noget der kan knække den mur?
Avatar billede arne_v Ekspert
06. juli 2014 - 23:46 #1
brug parameters
Avatar billede EveryMA Mester
06. juli 2014 - 23:48 #2
Hej Arne.

Det har jeg læst meget om, og det fik jeg også at vide i mit seneste spørgsmål. Men jeg har valgt at lave et nyt spørgsmål der relaterer til det med injections.

Jeg kan ikke finde en simpel og klar forklaring på hvad parameters præcist er. Jeg troede jeg vidste det, men åbenbart ikke. :)

Kan du give et lyneksempel eller noget?
Avatar billede arne_v Ekspert
06. juli 2014 - 23:52 #3
det er en metode som:
- haandterer valid input med ' i
- beskytter mod SQL injection
- i visse tilfaelde giver bedre performance
Avatar billede arne_v Ekspert
06. juli 2014 - 23:53 #4
et eksempel som viser syntax:

adParamInput = 1
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
cmd.CommandText = "SELECT COUNT(*) AS n FROM myusers WHERE un = @un AND pw = @pw"
cmd.Parameters.Append(cmd.CreateParameter("@un", adVarChar, adParamInput, 32))
cmd.Parameters.Append(cmd.CreateParameter("@pw", adVarChar, adParamInput, 32))
cmd.Parameters("@un") = "arne"
cmd.Parameters("@pw") = "duerikke"
Set rs = cmd.Execute
Response.Write rs("n")
Set rs = Nothing
Set cmd = Nothing
Set con = Nothing
Avatar billede EveryMA Mester
07. juli 2014 - 00:01 #5
Af hvilken grund sætter man @ foran UN og PW i sql-kaldet?

Det er egenlig ikke til et login-system, jeg tænker på at sikre mig. Men mere en side, som skal vise indhold fra databasen.

Jeg frygter at man kan trykke ind og slette alt i tabellen.

Jeg går ud fra at 'magien' sker i denne linje:

cmd.Parameters.Append(cmd.CreateParameter("@un", adVarChar, adParamInput, 32))


skåret rent ud er det jo:

arne, 200, 1, 32

Hvad skal de tal til for? adVarChar, adParamInput og 32?
Avatar billede arne_v Ekspert
07. juli 2014 - 00:13 #6
@ bruges til at angive at det er en parameter
Avatar billede arne_v Ekspert
07. juli 2014 - 00:13 #7
koden er bare et eksempel
Avatar billede arne_v Ekspert
07. juli 2014 - 00:14 #8
cmd.Parameters.Append(cmd.CreateParameter("@un", adVarChar, adParamInput, 32))

angiver at @un er en input varchar med max laengde 32
Avatar billede arne_v Ekspert
07. juli 2014 - 00:15 #9
cmd.Parameters("@un") = "arne"

saetter vaerdien af @un og den sikrer at alt i vaerdien opfattes som vaerdi og ikke som SQL
Avatar billede EveryMA Mester
07. juli 2014 - 00:20 #10
Skal man så til at starte med navngive @un? som i ;

@un = request.form("un")
eller

@un = request.querystring

hvis man arbejder med den ene eller den anden metode?

cmd.Parameters("@un") = "arne"
cmd.Parameters("@pw") = "duerikke"

Nu skriver du jo selv arne og "duerikke". Hvordan får jeg den oprindelige værdi ind?

cmd.Parameters("@un") = @un ?
Avatar billede arne_v Ekspert
07. juli 2014 - 00:27 #11
Nej - snarere:

cmd.Parameters("@un") = Request.form("un")
cmd.Parameters("@pw") = Request.form("pw")
Avatar billede EveryMA Mester
07. juli 2014 - 14:11 #12
Ok. Tak for det.
Men hvis jeg udelukkende arbejder med ID (for at få vist indhold) kan du på 'stående fod' så fortælle om man kan bryde igennem det eksempel jeg kom med i spørgsmålet? Omkring brugen af isNumeric?

Hvis querystring("id") ikke er et rent tal, så bliver man sendt tilbage. Det burde da kunne stå i mod ?
Avatar billede arne_v Ekspert
07. juli 2014 - 17:08 #13
Hvis id ikke er et tal saa vil du komme ind i if saetningen.

Saa du kan godt sige at den beskytter mod SQL injection.

Men det er ikke den rigtige loesning.
Avatar billede arne_v Ekspert
07. juli 2014 - 17:09 #14
Andet:

1)  response.redirect("tilbage til forsiden fordi id ikke er rent tal")

ser suepekt ud - Redirect tager en URL ikke en besked som argument.

2) id kan jo frit angives af brugeren saa alle har adgang til alt i den tabel medmindre der er yderlige logik som ikke er vist
Avatar billede EveryMA Mester
07. juli 2014 - 18:43 #15
Vedr. din nummer 2:

Jeg tænker på at sikre et nyhedssystem, hvor man kan klikke på en overskrift og derefter åbner den filen "vis.asp?id=5"... F.eks.

Så må brugeren gerne ændre id til 6-7-8 eller 9 hvis han vil. Men det skal bare ikke være muligt at slette alt i tabellen ved at manipulere med sql-kaldet.

Er det i øvrigt ikke ASP.NET du har skrevet for oven?
Avatar billede arne_v Ekspert
07. juli 2014 - 19:43 #16
Nej - det er klassisk ASP
Avatar billede EveryMA Mester
10. august 2014 - 11:53 #17
Okay.

Men kan du svare mig på mit oprindelige spørgsmål?
Avatar billede keysersoze Guru
10. august 2014 - 12:23 #18
isNumeric som du har sat det op beskytter fint - det er bare uhyre sjældent man kan nøjes med at arbejde med tal som input til databasen og derfor er det efter min mening både sikrest og lettest at gøre det rigtigt, altså parameters, i alle situationer i stedet for at blande.
Avatar billede EveryMA Mester
11. august 2014 - 13:43 #19
Men hvis man udelukkende hiver info ud fra databasen via. id (tal) kan det så ikke slås fast, at isNumeric er 100% sikkert?
Avatar billede keysersoze Guru
11. august 2014 - 14:04 #20
Jeg kan ikke lide at bruge 100% om særlig meget i denne verden, slet ikke når det handler om IT - men vil betragte det rimelig sikkert. Men ingen database uden at data også er komme ind og formentlig også kan redigeres samt slettes og her er isNumeric næppe nok og det er det jeg mener med at man lige så godt kan gøre det rigtigt fra starten og overalt i applikationen. Specielt når der formentlig bliver brugt mere tid på at diskutere om emnet fremfor at lære at gøre det rigtigt en gang for alle.
Avatar billede arne_v Ekspert
12. august 2014 - 02:43 #21
Jeg tror at jeg allerede svarede i #13.
Avatar billede EveryMA Mester
06. december 2014 - 21:08 #22
arne_v

du skrev: Saa du kan godt sige at den beskytter mod SQL injection.

Men det er ikke den rigtige loesning.


Men der findes vel oprindeligt ikke en rigtig løsning? Det er vel bare hvad man kan få til at fungere tænker jeg?
Avatar billede keysersoze Guru
06. december 2014 - 23:57 #23
jo, isnumeric brugt korrekt beskytter mod sql-injection i dit specifikke tilfælde. nej, isnumeric er ikke den rigtige løsning, det er derimod paramters og det er ikke bare en mulig løsning, det er den helt rigtige løsning.
Avatar billede arne_v Ekspert
07. december 2014 - 02:41 #24
At noget virker er ikke tilstraekkelig til at vaere en rigtig loesning.
Avatar billede EveryMA Mester
18. oktober 2015 - 16:46 #25
smid gerne svar, arne.

isnummeric var helt som ventet god. intet kan bryde forbi den og jeg sparer bøvlet med parameters. i mit tilfælde den rigtige løsning..

dog ikke når det kommer til muligheden for at bruge tal og tegn.
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