Detta är inte vad SQL Injection handlar om. Varje gång du använder parametrar som inte har sanerats i din SQL-fråga lämnar du din databas öppen för SQL-injektion, som kanske inte nödvändigtvis har som mål att förstöra data. Det kan också vara att stjäla data eller få obehörig åtkomst.
Tänk på ett mycket begränsat konto där allt det kan göra är att SELECT
. Du skriver en fråga för autentisering:
$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 normal inmatning förväntar du dig att frågan ska se ut så här:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Vilket ska returnera 1 som räkning om både användarnamn och pass matchar. Nu försöker en angripare logga in som admin. Eftersom du inte har rensat dina indata skickar de $_POST['user']
som:admin'; --
. Hela frågan blir:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Allt efter --
är en kommentar, så detta ignorerar det andra villkoret och returnerar 1 oavsett. Där har du, du har precis gett en illvillig användare administratörsåtkomst. Det är så några riktiga attacker utförs. Du börjar med ett lågprivilegierat konto och genom hål i säkerhet försöker du få tillgång till fler privilegier.
Lång historia kort, att ha ett applikationsomfattande konto med begränsade privilegier (t.ex.:ingen DROP
, ALTER
, etc) är bra. Ge aldrig någon eller något program fler privilegier än de behöver. Men för att förhindra SQL-injektion, använd förberedda uttalanden
.