← Terug naar IT-nieuws
Databases

Wat is SQL-injectie en hoe voorkom je het?

Leer wat SQL-injectie is, waarom onveilige databaseverzoeken gevaarlijk zijn en hoe prepared statements helpen.

Veel websites gebruiken een database om gegevens op te slaan. Denk aan contactaanvragen, gebruikersaccounts, producten of artikelen. Wanneer een website informatie uit een formulier rechtstreeks in een SQL-query verwerkt, kan dat een beveiligingsrisico opleveren. Een bekend voorbeeld daarvan is SQL-injectie.

Wat is SQL-injectie?

SQL-injectie is een aanval waarbij iemand probeert om via invoervelden of andere invoerkanalen de SQL-opdracht van een applicatie te beïnvloeden. Als de applicatie gebruikersinvoer onveilig samenvoegt met een query, kan ingevoerde tekst worden geïnterpreteerd als SQL-code.

Afhankelijk van de rechten van de databasegebruiker en de manier waarop de applicatie is gebouwd, kan een aanvaller mogelijk gegevens uitlezen, aanpassen of verwijderen. De precieze gevolgen verschillen per situatie.

Hoe ontstaat een kwetsbare query?

Een kwetsbaarheid ontstaat bijvoorbeeld wanneer een applicatie invoer direct aan een SQL-string toevoegt. De applicatie maakt dan geen voldoende onderscheid tussen de bedoelde query en de gegevens die een bezoeker heeft ingevoerd.

Alleen controleren of een veld gevuld is, of JavaScript-validatie gebruiken, is niet voldoende. Een aanvaller kan verzoeken rechtstreeks naar de server sturen en controles in de browser overslaan. De server moet invoer daarom veilig verwerken.

Gebruik prepared statements

De belangrijkste maatregel tegen SQL-injectie is het gebruik van prepared statements met parameterbinding. Daarbij wordt de SQL-opdracht gescheiden gehouden van de waarden die je eraan meegeeft. De database behandelt die waarden als gegevens en niet als uitvoerbare SQL-onderdelen.

Werk je met PHP en MySQLi, dan kun je bijvoorbeeld de volgende aanpak gebruiken:

<?php
$stmt = $conn->prepare(
    "SELECT id, naam FROM gebruikers WHERE email = ?"
);

$stmt->bind_param("s", $email);
$stmt->execute();

$resultaat = $stmt->get_result();
?>

In dit voorbeeld wordt de e-mailwaarde afzonderlijk gebonden. De placeholder ? geeft aan waar de waarde hoort. Gebruik deze aanpak consequent voor query's waarin gegevens van gebruikers worden verwerkt.

Controleer invoer aan de serverkant

Validatie blijft belangrijk. Controleer of een waarde het verwachte formaat heeft, of een numeriek veld daadwerkelijk een getal bevat en of verplichte velden zijn ingevuld. Gebruik waar mogelijk vaste toegestane waarden in plaats van vrije invoer.

Validatie vervangt prepared statements niet. Beide hebben een eigen functie: validatie controleert of invoer logisch en toegestaan is, terwijl parameterbinding voorkomt dat invoer als SQL-code wordt behandeld.

Beperk de rechten van de databasegebruiker

Een databaseaccount voor een website hoeft meestal niet alle mogelijke databasehandelingen te mogen uitvoeren. Geef het account alleen de rechten die de applicatie nodig heeft. Als een onderdeel uitsluitend gegevens moet lezen, is het niet nodig om dat account ook verwijderrechten te geven.

Gebruik daarnaast aparte accounts voor verschillende applicaties of omgevingen wanneer dat praktisch mogelijk is. Zo beperk je de gevolgen als één account wordt misbruikt.

Voorkom dat foutmeldingen gevoelige informatie tonen

Databasefouten kunnen informatie bevatten over tabellen, kolomnamen, query's of de serverconfiguratie. Toon zulke details niet rechtstreeks aan bezoekers. Registreer technische fouten op een afgeschermde plek en geef de gebruiker een algemene melding.

Controleer je volledige applicatie

SQL-injectie voorkom je niet met één aanpassing op één formulier. Controleer alle plekken waar gegevens uit URL's, formulieren, cookies of andere bronnen in databaseverzoeken terechtkomen. Gebruik prepared statements, beperk databaseprivileges en test de applicatie zorgvuldig.

Bij KICT besteden we bij maatwerkwebsites aandacht aan veilige gegevensverwerking en een goede technische opbouw. Wil je een website met databasefunctionaliteit laten ontwikkelen? Bespreek je project met KICT.

Ook een professionele website nodig?

KICT ontwikkelt volledig op maat gemaakte websites voor ondernemers. Ontdek wat er mogelijk is.

Bekijk onze mogelijkheden