Sql injection
Fra Wikipedia, den frie encyklopædi
SQL injection er et angreb rettet mod databasen i en applikation. Angrebet udnytter en sårbarhed i håndteringen af brugerinput og databasekald. Hvis brugerens input ikke renses for specielle tegn og sætninger kan applikationens databasekald blive manipuleret til at få en anden effekt end den ønskede.
SQL injection-angreb er ofte rettet mod websider med HTML-formularer, men kan rettes mod alle applikationer der har brugerinput og databasefunktionalitet.
Eksempel på et SQL injection angreb
En simpel HTML-formular med to inputfelter
-bruger
-kodeord
Disse hentes ind i variable i serverside-miljøet. Disse variabler kunne hedde henholdsvis $bruger og $kodeord
Derefter bruges de i et databasekald til at validere brugeren op mod en SQL database. SQL-kaldet kunne se ud som følger:
SELECT bruger_id FROM bruger_database WHERE bruger='$bruger' and kodeord='$kodeord' ;
I tilfælde af systemet bruges som forventet vil kaldet returnere brugerid'et og der kunne fortsættes med afvikling af koden. Men hvis en ondsindet bruger taster følgende ind i bruger feltet: "' or 1=1 ; --" (uden gåseøjne) vil SQL-kaldet se ud som følger:
SELECT bruger_id FROM bruger_database WHERE bruger=' ' or 1=1 ; --' and kodeord='$kodeord' ;
Alt hvad der står efter -- ignoreres, og tilbage står altså:
SELECT bruger_id FROM bruger_database WHERE bruger=' ' or 1=1 ;
Dette kald vil returnere brugerid'et på den første og bedste bruger i databasen, og den ondsindede bruger vil skabe sig adgang.
Dette eksempel er kun en ud af mange typer af SQL injection. Den ondsindede bruger kunne også forsøge at slette tabeller eller databaser, afsløre brugernavne og kodeord eller andet.
Sikring mod SQL injection
Der er flere ting en udvikler kan gøre for at undgå at blive offer for et SQL injection-angreb. Først og fremmest bør ALT input renses for visse tegn. Visse specialtegn bør enten filtreres helt fra eller konverteres (escapes), så de ikke behandles aktivt, men bliver gemt som det tegn de repræsenterer.
Desuden er det også vigtigt at den bruger der er forbundet til databasen ikke har flere rettigheder end nødvendigt. Et login-script som det i eksemplet, behøver for eksempel ikke have adgang til at slette rækker, tabeller eller databaser, og det bør reflekteres i de rettigheder databasebrugeren har.