02. juni 2015 - 22:59Der er
25 kommentarer og 1 løsning
SQL injection
Hej Jeg har "forsøgt" at sikre mig mod QSL injection, men jeg forstår skutte ikke helt hvorfor dette ikke virker.
Jeg har
sLim = "" & trim(request.querystring("lim")) 'Tjek for SQL injection strSQL = "SELECT * FROM matrix WHERE lim = ? limit 1" objCommand.Prepared = true objCommand.ActiveConnection = conn objCommand.CommandText = strSQL objCommand.Parameters.Append objCommand.CreateParameter("lim",200,1,50,sLim) Set rs = objCommand.Execute()
If (rs.eof) Then 'ikke godt response.redirect "my error page" end if
Men hvis jeg giver lim som fx "TIM OR 1=1" så accepterer den det. Hvordan får jeg det til at virker så den opfatter hele parameteren som direkte værdi til "lim"????
Men det er fint at den accepterer dit input som det står. Type 200 er en VARCHAR, så din strenge med dit giftige 1=1 indsættes som streng. Og det må det godt.
Det du gør svarer til at din SQL bliver:
SELECT * FROM matrix WHERE lim = 'TIM OR 1=1' limit 1
hvilket ikke er en fejl, eller noget det ligner SQL-injection. Havde du konkateneret det direkte ind i strengen ville nogen med en eller flere '-ere kunnet have begyndt at hacke sig ind.
Ja, men det underligere er at mit result set ikke er tomt når jeg giver den "TIM OR 1=1". Den passere altså if rs.eof then delen - og der findes ingen record i DB'en som indeholder "TIM OR 1=1" i "lim"?
Kan man ikke sætte en profiler eller noget trace op på en MySQL. Så kunne du givetvis se, hvad der rent faktisk blev sendt til MySQL. Det er bedre end at gætte... :-)
Hej Nej, ideen med at indsende værdierne som parametre er jo netop at man undgår at SQL bliver bygget op, så man kan sende SQL kommandoer direkte ned i DB'en. Men det er satme underligt at det ikke virker - og det gør det fortsat ikke :(
Prøv evt. at kalde databasen i det lidt forkortede format:
sLim = "" & trim(request.querystring("lim")) 'Tjek for SQL injection strSQL = "SELECT * FROM matrix WHERE lim = ? limit 1" objCommand.ActiveConnection = conn objCommand.CommandText = strSQL Set rs = objCommand.Execute(, Array(sLim))
If (rs.eof) Then 'ikke godt response.redirect "my error page" end if
Her sendes parameteren ind i et array der er parameter til Execute-metoden på command-objektet. Typen bestemmes automatisk af ADO, så du slipper for at forholde dig til den eksplicitte oprettelse af parameteren.
I SQL Server ville dette fungere, men jeg ved ikke om ADO-driveren til MySQL er bygget på samme måde og med de samme features, som den til SQL Server. Prøv det! :-)
Det format accepterer den, men det samme fortsætter med at ske. lim=Tim giver 1 hit, lim=Tim jdfhkf giver 0 hits men lim=Tim OR 1=1 så går den i selvsving og timer ud :(
Nu er jeg lidt i tvivl - jeg troede det var et SQL Injection problem, men det lyder mere som om det er et timeout-problem? Hvis det er tilfældet kunne det mere lyde som om du får skabt et uendelig loop/redirect eller lignende?
Det kunne måske være interessant, at se hvilken kode du har efter du har fået returneret rs. Kunne det være en løkke der gennemløber rs, hvor du har glemt at flytte frem i resultatet (rs.movenext)?
Hej, der er ingen loops eller do while eller do until. Det er en helt simpel testside. Men det burde jo også være ligemeget for den skal jo opfatte "tim OR 1=1" som en streng og dermed returnere et tom rs, som bør gå i min IF og gå til error page. Den går jo fint til error page hvis jeg indtastet en hvilken som helst anden ugyldig tekst fx tim OR 1=2 eller tim julemanden er sød. Det er først når der kommer et sandt udtryk ind i billedet fx 1=1
keysersoze -> Jeg vil gerne undgå SQL injection. Derfor bruger jeg parametere i mit kald. Men den acceptere alligevel SQL udtryk som fx OR 1=1. Sådan ser det i hvert fald ud
Lukker, fandt aldrig årsagen. Lavede mindre fin løsning på problemet, hvor jeg øverst på siden tjekker efter en række tegn og treds i URL'en, går den ud SAND returnerer den til forsiden.
Synes godt om
Ny brugerNybegynder
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.