SQL Injection er en kritisk sikkerhedssårbarhed, hvor en angriber manipulerer SQL-forespørgsler ved at indsætte ondsindet input, så databasen udfører uautoriserede kommandoer. Angrebet udnytter manglende adskillelse mellem data og SQL-logik.
SQL injection opstår, når brugerinput indsættes direkte i SQL-queries uden korrekt parameterisering. Databasen kan ikke skelne mellem legitim SQL og injiceret input og eksekverer derfor angriberens payload med applikationens rettigheder.
Det er et server-side angreb med fuld adgang til data-laget.
SQL injection er muligt, når:
SQL-queries bygges via string-konkatenation
Prepared statements ikke anvendes korrekt
ORM’er omgås via raw queries
Input valideres forkert eller antages “sikkert”
Eksempel (usikkert): SELECT * FROM users WHERE email = '$email';
Payload: ' OR 1=1 --
Læsning, ændring og sletning af data
Omgåelse af autentifikation
Eskalering til systemkompromittering
I visse tilfælde remote code execution
Databrud
Nedetid
Tab af kundetillid
Store juridiske og økonomiske konsekvenser
Brud på GDPR og andre databeskyttelseskrav
Audit-fund og bøder
Login-formularer
Søgefelter
Filtrering og sortering
Admin-paneler
API-parametre
Classic / In-band
Blind SQL Injection
Time-based SQL Injection
Error-based SQL Injection
Second-order SQL Injection
Alle udnytter samme grundfejl: ukontrolleret input i SQL.
Prepared statements er ikke valgfrit
Eksempel (PDO): $stmt = $pdo->prepare(
'SELECT * FROM users WHERE email = ?'
);
Stol på query builders
Undgå raw SQL hvor muligt
Hvis raw SQL er nødvendigt: bind parametre
Databasebrugere må kun have nødvendige rettigheder
Ingen SUPER, DROP eller FILE i runtime-brugere
Valider type og længde
Brug whitelists for kolonnenavne og sortering
HTML-escaping
JavaScript-validering
WAF som eneste forsvar
“Vi bruger et framework”
Frameworks beskytter kun, hvis de bruges korrekt.
SQL injection er ofte game over. Angrebet kompromitterer hele systemet.
Sårbarheden findes ofte i ældre kode, hotfixes eller edge cases.
Enhver moderne applikation uden korrekt SQL-beskyttelse er uacceptabel.
Udfordring: Legacy kodebase
Løsning: Gradvis refaktorering til prepared statements
Udfordring: Dynamisk filtrering
Løsning: Whitelist tilladte felter og operatorer
Udfordring: Performance-bekymringer
Løsning: Prepared statements forbedrer ofte performance
SQL injection er en velkendt og fuldt undgåelig sårbarhed.
Hvis SQL og brugerinput blandes direkte, er kompromittering kun et spørgsmål om tid.
Korrekt brug af parameterisering er ikke en “best practice”.
Det er et minimumskrav.