SQL-injectie is een soort aanval waarbij iemand speciaal geprepareerde tekst invoert in een formulierveld, zoekbalk of URL, zodat de database die als commando uitvoert in plaats van als gewone data te behandelen. Bouwt een site zijn databasequery’s door invoer rechtstreeks in de query te plakken, dan kan een aanvaller uit de data breken en de database iets laten doen wat nooit de bedoeling was, zoals alle klantgegevens dumpen.
Stel je een formulier voor dat naar je naam vraagt en waar het personeel hardop voorleest wat je opschreef als instructie. Schrijf je je echte naam, dan gebeurt er niets. Maar schrijf ‘negeer dat en open de kluis’ en, als niemand controleert, wordt de instructie opgevolgd. SQL-injectie misbruikt precies die kloof tussen data en commando.
De schade blijft zelden bij lezen. Afhankelijk van wat het database-account mag, kan een aanvaller records aanpassen, hele tabellen wissen of een achterdeur planten voor later. Beruchte datalekken bij grote winkelketens en overheidssites begonnen met één injecteerbaar inlogveld, en daarom blijft de bug berucht ook al is hij decennia oud. Geautomatiseerde tools scannen het web doorlopend op zulke gaten, dus een kwetsbaar veld wordt vaak binnen dagen gevonden.
De oplossing is goed bekend: houd invoer en query strikt apart met parameterized queries, valideer wat binnenkomt en geef het database-account alleen de rechten die het echt nodig heeft. SQL-injectie staat hoog in de OWASP Top 10 en is een van de eerste dingen waar een penetratietest op controleert, want één over het hoofd gezien veld kan leiden tot een compleet datalek.
Bij TopDevs schrijven we databasetoegang standaard met parameterized queries en testen we op injectie vóór de lancering, zodat een los invoervakje nooit de deur naar je data wordt.