En SQL-injektion er en ondsindet dannet SQL-forespørgsel, der bruges til at "forvirre" en SQL-database til at give noget, den ikke burde. Overvej f.eks. følgende forespørgsel
"SELECT * FROM `users` WHERE `username` = '$name'";
I et normalt tilfælde vil dette virke. Hvis vi sender 'Jack' til dette, vil det returnere alle brugere ved navn Jack. Men hvis en bruger indtaster, sig "' ELLER 1=1", ville den resulterende forespørgsel være
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";
Da 1 altid er lig med 1, og kombinationssætningen er OR, vil dette returnere sandt på hver række, hvilket igen vil vise HVER række til den ondsindede bruger. Ved at bruge denne teknik kan nogen se hele din database. Overvej også, om nogen sender noget som "'; DROP TABLE users
";--, hvilket resulterer i
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";
Hvilket er to forespørgsler, den ene som ikke gør noget, den anden som sletter HELE brugerdatabasen, hvilket resulterer i tab af dine data.
Den bedste metode til at forhindre SQL-injektioner er at bruge forberedte sætninger. Med disse sender du en forespørgsel til SQL-databasen, der siger noget i stil med
"SELECT * FROM `users` WHERE `username` = '?'";
Dette lader databasen vide formatet på forespørgslen (HVOR brugernavn er lig med en vis værdi), så der er ingen forvirring, når der gives en almindelig tekstforespørgsel. Så ved databasen at forvente én værdi, og hvor den skal placeres. Så sender du den værdi til databasen, som den kan bruge til at søge. Dette er også bedre, da databasen kan optimere forespørgslen til hurtigere søgning.
Læs op på udarbejdede udtalelser, som vil forklare dette mere detaljeret.