Veiligheid

← Terug naar overzicht

SQL Injectie

SQL Injectie is een van de meest voorkomende beveiligingsproblemen bij websites die een database gebruiken. Het werkt als volgt:

Stel je hebt een inlogformulier. De gebruiker vult een gebruikersnaam in en jouw PHP-code bouwt een query:

$query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'";

Als de gebruiker netjes jan invult, wordt de query:

SELECT * FROM users WHERE username = 'jan'

Maar wat als iemand dit invult als gebruikersnaam?

' OR 1=1 --

Dan wordt de query:

SELECT * FROM users WHERE username = '' OR 1=1 --'

Nog erger: iemand kan '; DROP TABLE users; -- invoeren en je hele tabel verwijderen.

Bescherming: Prepared Statements

De oplossing is prepared statements (ook: parameterized queries). Hierbij scheidt je de SQL-structuur van de data:

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);

Nu wordt de invoer van de gebruiker altijd als data behandeld, nooit als SQL-code. Zelfs als iemand ' OR 1=1 -- invult, zoekt de database letterlijk naar een gebruiker met die naam.

Regel: Gebruik altijd prepared statements wanneer je gebruikersinvoer in een query verwerkt. Bouw nooit queries door strings aan elkaar te plakken.

Oefening 1

Je PHP-code bouwt een query: "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'". Een gebruiker vult in: ' OR 1=1 --. Wat wordt de uiteindelijke query en wat is het effect?

Jouw code:

Oefening 2

Een kwaadwillende gebruiker vult als gebruikersnaam in: '; DROP TABLE users; --. Wat kan er gebeuren?

Jouw code:

Oefening 3

Hoe voorkom je SQL Injectie in je code?

Jouw code:

Oefening 4

Waarom werkt SQL Injectie niet bij prepared statements, zelfs als de gebruiker ' OR 1=1 -- invoert?

Jouw code: