08. juni 2012 - 20:57Der 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.
PHP - mysqli eller PDO med prepared statement ASP.NET - parameters ASP - parameters (ja klassisk ASP har ogsaa parameters !!) Java - prepared statement
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.
#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.
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
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.
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).
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.