Een SQL-injectie is een kwaadwillig gevormde SQL-query die wordt gebruikt om een SQL-database te "verwarren" om iets te geven wat het niet zou moeten doen. Beschouw bijvoorbeeld de volgende vraag
"SELECT * FROM `users` WHERE `username` = '$name'";
In een normaal geval zal dit werken. Als we 'Jack' hieraan toevoegen, worden alle gebruikers met de naam Jack geretourneerd. Als een gebruiker echter invoert, zeg "' OF 1=1", dan zou de resulterende vraag zijn
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";
Aangezien 1 altijd gelijk is aan 1, en de combinatieclausule OR is, zal dit op elke rij true retourneren, die op zijn beurt ELKE rij zal weergeven aan de kwaadwillende gebruiker. Met behulp van deze techniek kan iemand uw volledige database bekijken. Overweeg ook of iemand iets instuurt als "'; DROP TABLE users
";--, wat resulteert in
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";
Dat zijn twee zoekopdrachten, een die niets zal doen, de tweede die de VOLLEDIGE gebruikersdatabase verwijdert, wat resulteert in het verlies van uw gegevens.
De beste methode om SQL-injecties te voorkomen, is het gebruik van voorbereide instructies. Hiermee stuur je een query naar de SQL-database die iets zegt als
"SELECT * FROM `users` WHERE `username` = '?'";
Hierdoor weet de database het formaat van de query (WAAR gebruikersnaam gelijk is aan een bepaalde waarde), dus er is geen verwarring wanneer een query in platte tekst wordt gegeven. Dan weet de database één waarde te verwachten en waar deze moet worden geplaatst. Vervolgens geeft u die waarde door aan de database die deze kan gebruiken om te zoeken. Dit is ook beter omdat de database de zoekopdracht kan optimaliseren voor sneller zoeken.
Lees de voorbereide verklaringen, die dit in meer detail zullen uitleggen.