Avatar billede kak Nybegynder
08. juni 2012 - 20:57 Der er 14 kommentarer og
1 løsning

Beskyttelse mod SQL injection

Jeg ved der er mange indlæg vedr. SWL injection her på eksperten, men jeg har ikke fundet præcis de svar jeg leder efter, så nu prøver jeg selv at stille spørgsmålene....

Når man bruger MySQL, er det så nok at fjerne alle ' fra mulige input fra brugerne, for at sikre sig mod SQL injection?

Og hvis det er et felt, hvor brugeren gerne må skrive dette tegn, har jeg både fundet sider der siger at, det er nok at erstatte ' med '', mens jeg har fundet andre der skriver, at hackeren så blot kan bruge \ for at omgå dette. Men hvad er korrekt? Hvordan løser man det, hvis brugeren gerne må bruge ' i input-felterne?

Og endelig har jeg fundet sider der skriver, at man kan bruge %27 i stedet for ', men hvis brugeren gør dette, er det så stadig nok at tage højde for ' ved at fjerne dem eller ved at erstatte dem med ''?

Jeg har prøvet at bruge "Netsparker" for at teste nogle af mine sites for sårbarheder. Her får jeg f.eks. en advarsel, fordi en side tillader noget ala ?id=-1 or 1=1. De viser, at siden laver en fejl, men hvis jeg selv sætter dette ind som en querystring til siden, så hvordan beskytter man sig mod dette, da det jo ikke har noget med ' at gøre?

Jeg vil lige nævne, at jeg bruger asp og asp.net, og så vidt jeg har kunnet læse mig frem til, er "mysql_real_escape_string()" en php funktion!? Jeg har også læst, at brug af parametre i asp.net er en bedre løsning, og en masse forskellige løsninger, men jeg håber at få nogle konkret svar på, hvor vidt det er nok at fjerne ' eller ej.
Avatar billede kak Nybegynder
08. juni 2012 - 21:34 #1
Lige et tillægsspørgsmål... Jeg har fundet denne løsning på en eller anden side:


StringToHandle = Replace(StringToHandle,CHR(92),CHR(92) & CHR(92))
StringToHandle = Replace(StringToHandle,CHR(39),CHR(92) & CHR(39))

Altså erstatning af \ med \\ og derefter erstatning af ' med \'

Nogle meninger om, hvor vidt det er en sikker metode?
Avatar billede erikjacobsen Ekspert
08. juni 2012 - 22:29 #2
Glem replace, og læs http://www.eksperten.dk/guide/1480
Avatar billede arne_v Ekspert
08. juni 2012 - 22:30 #3
Replace duer ikke.

Du skal bruge:

PHP - mysqli eller PDO med prepared statement
ASP.NET - parameters
ASP - parameters (ja klassisk ASP har ogsaa parameters !!)
Java - prepared statement
Avatar billede arne_v Ekspert
08. juni 2012 - 22:31 #4
Givet kode snippet er http://www.eksperten.dk/guide/1250 nok mere relevant
Avatar billede kak Nybegynder
08. juni 2012 - 22:57 #5
Tak for det! Så vidt jeg kan gennemskue, så betyder de to guides, at jeg skal ind og ændre en hel del på eksisterende sider, for at få det implementeret. Helt sikkert en brugbar løsning fremadrettet, men uoverskuelig på eksiterende ting.

Er der andre og mindre "pæne" løsninger, men som er lettere at implementere på eksisterende kode?

Jeg troede egentlig, at ' altid blev brugt ved SQL injection, for at "afbryde" den oprindelig sql-sætning, og indsætte sin egen. Hvorfor er det ikke nok at fjerne disse? Når jeg spørger, er det bl.a. fordi jeg netop har oplevet et sql injection angreb på en side, og det var lige præcis på den side, hvor ' ikke blev fjernet, mens der ikke var sket noget på de andre sider, hvor ' blev fjernet.
Avatar billede erikjacobsen Ekspert
08. juni 2012 - 23:03 #6
#4: Ja

#5: Det er dumt at fjerne tegn, såsom ' - man kan jo hedde O'Brian. I stsdet for at spekulere på hvilke tegn, man skal gøre noget ved, er Prepared Statements o.lign. netop beregnet på at de selv holder styr på den slags. De kan endda være hurtigere.

Og ja, du skal lave en masse om.
Avatar billede montago Praktikant
09. juni 2012 - 00:54 #7
Drop ASP og brug kun ASP.NET (ASP kan jo relativt nemt opkonverteres til ASP.NET hvis man har tiden til det)

og begyndt at bruge LINQ to Entities også kaldet Entity Framework. Herved bliver al kommunikation med MySQL oversat til noget der ligner prepared statements/Stored Procedures hvor injection ikke kan lade sig gøre.

For at sætte kronen på værket, skal du bruge Microsofts Sanitizer framework, som kan hentes via NuGet eller manuelt via googlesøgning.

ved at kalde Sanitizer.GetSafeHTMLFragment(<usikkertekst>) kan du gemme inputværdier i din database som sikre mod XSS hacks

(XSS er lige så slem som injection !!)
Avatar billede montago Praktikant
09. juni 2012 - 00:58 #8
og hvis du alligevel skal igang med at konvertere dine projekter, så kig engang på ASP.NET MVC3 (snart MVC4) som er en blanding mellem ASP og ASP.NET, som på en måde minder mest om ASP, men har .NET med i skuffen.

MVC er the EPIC WIN !
Avatar billede arne_v Ekspert
09. juni 2012 - 03:19 #9
#5

Ved at fjerne ', saa modifcerer du data og beskytter ikke mod all former for SQL injection (der er bl.a. tal som ikke er quotet og nogle "sjove" problemer med asiatiske tegnsaet).

Parameters er meget bedre.
Avatar billede arne_v Ekspert
09. juni 2012 - 03:20 #10
#7-8

ASP er aldeles foraeldet saa man boer skifte.

Jeg vil dog ikke kalde ASP->ASP.NET for en opkonvertering. Det er eller ihvertfald boer vaere redesign fra bunden af.
Avatar billede kak Nybegynder
09. juni 2012 - 08:07 #11
Konvertering til asp.net er desværre ikke en realistisk mulighed på eksisterende asp løsninger, men jeg bruger også asp.net på nye ting.

arne_v har du et eksempel på brug af parametre i klassisk asp? Når jeg søger på det, finder jeg kun asp.net eksempler.

Men vil det sige, at hvis jeg "blot" bruger parametre (både i klassisk og .net), så er det helt "injection safe"?
Avatar billede arne_v Ekspert
09. juni 2012 - 15:13 #12
se link i #4
Avatar billede arne_v Ekspert
09. juni 2012 - 15:13 #13
konsekvent brug af parameters beskytter mod SQL injection
Avatar billede kak Nybegynder
10. juni 2012 - 20:20 #14
Så bliver løsningen et skift til brug af parametre. Opretter du lige et svar arne_v, så du kan få point!
Avatar billede arne_v Ekspert
11. juni 2012 - 00:48 #15
svar
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
Computerworld tilbyder specialiserede kurser i database-management

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