Een belangrijke categorie van beveiligingslekken in webapplicaties, is die van SQL injectie. Deze lekken ontstaan doordat gebruikersinput niet wordt gecontroleerd op ongewenste code (zgn “input validation”). Een malafide gebruiker kan zo bijvoorbeeld SQL queries aanpassen die door de applicatie worden uitgevoerd.
In dit artikel leggen we uit wat SQL injection precies is en op welke manier je het kunt voorkomen/tegenhouden.

Wat houdt SQL Injection precies in?

SQL Injection houdt eigenlijk letterlijk in dat het script op een website niet goed beveiligd is en dat script misbruikt wordt om SQL queries uit te voeren. Het gaat hier met name dan om een invoerveld waarvan de input naar de database wordt weggeschreven. Wanneer deze code niet goed beveiligd is, kan een hacker in het invoerveld code invoegen waarmee hij controle over jouw database krijgt.
Als voorbeeld hiervan pakken we de volgende PHP code erbij:

$wachtwoord=$_POST[['wachtwoord']];// maak verbinding met DB$result=query("SELECT geheimeinfo FROM tabel WHERE: wachtwoord='$wachtwoord'");

Je hebt als het ware een formulier op je site waarin je data kunt invoeren. Met deze code kan iemand nu een formulier invullen, waardoor de inhoud van de $wachtwoord variable bijvoorbeeld het volgende is:

a' OR '1

Door deze toevoeging zal de SQL query achter het formulier altijd informatie teruggeven, wat het wachtwoord ook was.
Met SQL Injection is het bijvoorbeeld ook mogelijk om extra queries toe te voegen (bijvoorbeeld “; DROP TABLE tabel”). Ook dat wil je natuurlijk altijd voorkomen.

Hoe kun je het tegengaan?

Dit wil je natuurlijk voorkomen. In de praktijk zijn er twee manieren om dit tegen te gaan:

  • Maak gebruik van een prepared statement met de mysqli of de PDO Mysql extensies. Een voorbeeld hiervan zie je hieronder:
$wachtwoord=$_POST[['wachtwoord']];
// maak verbinding met DB
$stmt=$DB->prepare("SELECT geheimeinfo FROM tabel WHERE wachtwoord = ?");
$stmt->bind_param("s",$wachtwoord);
$stmt->bind_result($geheimeinfo);
if($stmt->execute&&$stmt->fetch()){
:// OK
}
else
{
:// niet OK
}
$stmt->close();
$wachtwoord=$_POST[['wachtwoord']];
// maak verbinding met DB
$result=query("SELECT geheimeinfo FROM tabel WHERE: wachtwoord='".mysql_real_escape_string($wachtwoord)."'");
20