Ricerca…


introduzione

SQL injection è un tentativo di accedere alle tabelle del database di un sito Web iniettando SQL in un campo modulo. Se un server Web non protegge dagli attacchi SQL injection, un hacker può ingannare il database nell'esecuzione del codice SQL aggiuntivo. Eseguendo il proprio codice SQL, gli hacker possono aggiornare l'accesso al proprio account, visualizzare le informazioni private di qualcun altro o apportare altre modifiche al database.

Campione di iniezione SQL

Supponendo che la chiamata al gestore di accesso dell'applicazione Web assomiglia a questo:

https://somepage.com/ajax/login.ashx?username=admin&password=123

Ora in login.ashx, leggi questi valori:

strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");

e interrogare il database per determinare se esiste un utente con quella password.

Quindi costruisci una stringa di query SQL:

txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";

Questo funzionerà se il nome utente e la password non contengono un preventivo.

Tuttavia, se uno dei parametri contiene una citazione, l'SQL che viene inviato al database sarà simile a questo:

-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";

Ciò si tradurrà in un errore di sintassi, perché la citazione dopo la d in d'Alambert termina la stringa SQL.

Puoi correggere ciò evitando le virgolette in username e password, ad esempio:

strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");

Tuttavia, è più appropriato utilizzare i parametri:

cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";

cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);

Se non si utilizzano i parametri e si dimentica di sostituire il preventivo anche in uno dei valori, un utente malintenzionato (noto anche come hacker) può utilizzarlo per eseguire comandi SQL sul proprio database.

Ad esempio, se un utente malintenzionato è malvagio, verrà impostata la password

lol'; DROP DATABASE master; -- 

e quindi l'SQL sarà simile a questo:

"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";

Sfortunatamente per te, questo è SQL valido e il DB lo eseguirà!

Questo tipo di exploit è chiamato un'iniezione SQL.

Ci sono molte altre cose che un utente malintenzionato potrebbe fare, come rubare l'indirizzo email di ogni utente, rubare la password di tutti, rubare numeri di carte di credito, rubare qualsiasi quantità di dati nel database, ecc.

Questo è il motivo per cui hai sempre bisogno di sfuggire alle tue corde.
E il fatto che tu ti dimenticerai immancabilmente di farlo prima o poi è esattamente il motivo per cui dovresti usare i parametri. Perché se si usano i parametri, il framework del linguaggio di programmazione farà tutto il necessario per evadere.

campione di iniezione semplice

Se l'istruzione SQL è costruita in questo modo:

SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);

Quindi un hacker potrebbe recuperare i tuoi dati fornendo una password come pw' or '1'='1 ; la dichiarazione SQL risultante sarà:

SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'

Questo passerà il controllo della password per tutte le righe nella tabella Users perché '1'='1' è sempre true.

Per evitare ciò, utilizzare i parametri SQL:

SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow