Dette er ikke hvad SQL Injection handler om. Hver gang du bruger parametre, der ikke er blevet renset i din SQL-forespørgsel, lader du din database stå åben for SQL-injektion, som måske ikke nødvendigvis har til formål at ødelægge data. Det kan også være at stjæle data eller få uautoriseret adgang.
Overvej en meget begrænset konto, hvor alt den kunne gøre er SELECT
. Du skriver en forespørgsel til godkendelse:
$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
Med normalt input forventer du, at forespørgslen ser sådan ud:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Hvilket skal returnere 1 som tæller, hvis både brugernavn og pass matcher. Nu forsøger en angriber at logge på som admin. Da du ikke har renset dine input, sender de $_POST['user']
som:admin'; --
. Hele forespørgslen bliver:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Alt efter --
er en kommentar, så dette ignorerer den anden betingelse og returnerer 1 uanset. Der er du, du har lige givet en ondsindet bruger admin adgang. Det er sådan nogle rigtige angreb udføres. Du starter med en lavprivilegeret konto, og gennem huller i sikkerheden forsøger du at få adgang til flere privilegier.
Lang historie kort, at have en konto i hele applikationen med begrænsede rettigheder (f.eks.:ingen DROP
, ALTER
osv.) er god. Giv aldrig nogen eller nogen applikation flere privilegier, end de har brug for. Men for at forhindre SQL-injektion skal du bruge forberedte sætninger
.