Questo non di cosa tratta SQL injection. Ogni volta che si utilizzano parametri che non sono stati disinfettati nella query SQL, si lascia il database aperto all'iniezione SQL, che potrebbe non avere necessariamente l'obiettivo di distruggere i dati. Potrebbe anche essere per rubare dati o ottenere accessi non autorizzati.
Considera un account molto limitato in cui tutto ciò che potrebbe fare è SELECT
. Scrivi una query per l'autenticazione:
$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
Con l'input normale, ti aspetti che la query assomigli a:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Che dovrebbe restituire 1 come conteggio se sia il nome utente che il pass corrispondono. Ora un utente malintenzionato tenta di accedere come amministratore. Dal momento che non hai disinfettato i tuoi input, inviano $_POST['user']
come:admin'; --
. L'intera query diventa:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Tutto dopo --
è un commento, quindi ignora l'altra condizione e restituisce 1 a prescindere. Ecco fatto, hai appena concesso a un utente malintenzionato l'accesso come amministratore. È così che vengono eseguiti alcuni veri attacchi. Inizi con un account con privilegi bassi e attraverso falle nella sicurezza cerchi di accedere a più privilegi.
Per farla breve, avere un account a livello di applicazione con privilegi limitati (ad esempio:nessun DROP
, ALTER
, ecc.) è buono. Non concedere mai a nessuno oa nessuna applicazione più privilegi di quelli di cui hanno bisogno. Ma per prevenire l'iniezione SQL, usa dichiarazioni preparate
.