SQL-injeksjon er en angrepsmetode mot datasystemer der en sql-setning blir manipulert til å gjøre ting den ikke var ment til å gjøre. Angrepet muliggjøres kun hvis bruker-input blir brukt til å bygge opp SQL-setningen. Dersom en angriper vet hvilken type datasystemer som er i samspill kan bruker-input spesialkontrueres til å skape en syntaktisk korrekt sql-setning som gjør noe helt uforventet. Dette kan være for eksempel å hente ut sensitiv data fra en database, typisk brukernavn, passord og epostadresser.

Eksempel (litt teknisk) rediger

Et helt enkelt eksempel på er den typiske innloggingsspørringen:

SELECT * FROM users WHERE username = '$username' AND password = '$password'

Spørringen slår opp i databasen om det fins en bruker med det gitte brukernavn og passord, og vil naturligvis returnere ingen resultater dersom brukernavn og passord ikke stemmer overens (feil passord eller brukernavn).

Dersom en angriper har kontroll over variabelen $username kan denne settes til å være:

' OR 1=1--

Det første tegnet er enkel apostrof og vil bryte ut av den statiske innkapslingen av apostrofer. Det som kommer etter er et uttrykk som alltid vil være sant: 1=1. De to siste tegnene; to bindestreker, er metategnene for start av kommentar i mange databasesystemer. Resultatet blir at resten av spørringen kommenteres vekk.

Den endelige spørringen vil se slik ut:

SELECT * FROM users WHERE username = '' OR 1=1-- ' AND password = '$password'

Spørringen vil alltid returnere sant og vil hente ut alle brukere. Den første brukeren i databasen er ofte administrator brukeren, og i praksis vil vedkommende som injiserte denne setningen bli logget inn som administrator.

Hvordan forhindre rediger

Gjør hvitvasking av all brukerinput.