Dit is niet waar SQL-injectie over gaat. Elke keer dat u parameters gebruikt die niet zijn opgeschoond in uw SQL-query, laat u uw database open voor SQL-injectie, wat niet noodzakelijkerwijs het doel heeft om gegevens te vernietigen. Het kan ook zijn om gegevens te stelen of ongeautoriseerde toegang te krijgen.
Overweeg een zeer beperkt account waar het alleen SELECT
is . U schrijft een vraag voor authenticatie:
$sql = "SELECT COUNT(*) AS count
FROM users
WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
// check if returns a count of 1, if yes, log in
Bij normale invoer verwacht u dat de query er als volgt uitziet:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Die 1 zou moeten retourneren als de telling als zowel gebruikersnaam als pass overeenkomen. Nu probeert een aanvaller in te loggen als beheerder. Omdat je je invoer niet hebt opgeschoond, sturen ze $_POST['user']
als:admin'; --
. De hele zoekopdracht wordt:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Alles na --
is een opmerking, dus dit negeert de andere voorwaarde en retourneert hoe dan ook 1. Alsjeblieft, je hebt zojuist beheerderstoegang verleend aan een kwaadwillende gebruiker. Dat is hoe sommige echte aanvallen worden uitgevoerd. Je begint met een account met weinig privileges en door gaten in de beveiliging probeer je toegang te krijgen tot meer privileges.
Om een lang verhaal kort te maken, een applicatie-breed account hebben met beperkte rechten (bijv.:geen DROP
, ALTER
, enz.) is goed. Geef nooit iemand of een applicatie meer privileges dan ze nodig hebben. Maar om SQL-injectie te voorkomen, gebruikt u voorbereide instructies
.