Hoe gaat SQL-Injection te werk?
Een voorbeeld van SQL-injection:
Het veranderen van deze sql-queries kan eigenlijk heel gemakkelijk gebeuren, aangezien iedereen openlijk de bron van elke website kan bekijken en dus op die manier al een brood in de schoot word geworpen over de mogenlijke database-layout. Hoe? Zoals dit:
Deze pagina demonstreert een simpel html-formulier
--------------------------------------------------
Naam: [naam_user input="text"]
Password: [password_user input="password"]
[Register input="submit"]
Waarbij de kwade gebruiker (ik noem hem even Pietje, makkelijker dan dat ik hele tijd 'kwaadaarige gebruiker' moet typen Knipoog/Wink ) even in de bron gaat kijken en waarempel dit vindt:
Code:
<form action="register.php" method="POST">
Naam: <input type="text" name="naam_user" /><br />
Password: <input type="password" name="password_user" /><br />
<input type="submit" value="Register" />
</form>
Als Pietje zijnde is het niet zo moeilijk om te achterhalen dat deze gegevens dus naar de pagina "register.php" gestuurd worden met de POST-variabelen 'naam_user' en 'password_user'. Waarschijnlijk een grote kans dat de kolomnamen van de database dan ook dezelfde naam hebben, of een naam die hierop lijkt. Nu gokt Pietje erop dat de PHP code met de SQL-query als volgt uit ziet:
Code:
2
3
4
$SQL = "INSERT INTO table (naam_user, password_user) VALUES ('" . $_POST['naam_user'] . "', '" . $_POST['password_user'] . "')";
mysql_query($SQL);
?>
En nu komt dat de echte injection: wat als Pietje nu het volgende in het naam-veld gaat invullen bij het formulier (en de rest van de formuliervelden, in dit geval alleen het password-veld, normaal invult):
Ingevulde waarde van Naam-veld door Pietje:
Pietje Puk', 'passwoord1'), ('Sinterklaas
Dan komt de query er als volgt uit te zien (!!!)
Code:
2
3
4
$SQL = "INSERT INTO table (naam_user, password_user) VALUES ('Pietje Puk', 'passwoord1'), ('Sinterklaas', 'passwoord2')";
mysql_query($SQL);
?>
En ja, nu is er dus een groot probleem, aangezien Pietje nu dus vanalles kan invullen in de database, nu is dat bij een registratie van een gebruiker niet zo'n ramp, hij had net zogoed twee keer een formulier in kunnen vullen, maar je kunt je waarschijnlijk genoeg scenario's bedenken waar dit wel degelijk uitmaakt.