SQL Injection: cos’è?
In generale il sql injection è una tattica con cui un malintenzionato riesce ad eseguire qualsiasi operazione sul database, sia questa di aggiunta, modifica o cancellazione di dati. Se poi l’attaccante agisce su Sql Server, MySql o simili, i pericoli sono ancora maggiori: basti pensare a cosa potrebbe fare una volta acquisiti i permessi di amministratore.
Come funziona
Il sql injection prevede l’inserimento di istruzioni sql nella query di interrogazione del database. Per un esempio, basta pensare ad una pagina di login con i due campi nome utente e password. Un malintenzionato può inserire qualsiasi istruzione SQL nel primo campo semplicemente scrivendo: ‘comando. L’apostrofo (’) infatti segna la fine della stringa. Ecco a confronto le due query che potrebbero venire fuori dalla tecnica precedente, la prima è quella corretta, la seconda è quella contraffatta:
SELECT * FROM utenti WHERE
nome = 'minifloppy' AND password = 'webmaster'
SELECT * FROM utenti WHERE
nome = '';query contraffatta--AND password = 'webmaster'
I cracker sono ancora più facilitati se nel form viene richiesto un valore numerico. In questo caso basterebbe semplicemente inserire la query contraffatta.
Come difendersi
Le difese possono essere principalmente tre:
- Cercare di far diventare l’input corretto
- Non accettare input che è stato riconosciuto come non corretto
- Accettare solo input corretto
La prima è decisamente da scartare perchè modificando l’input potremmo incorrere in molti problemi. Primo fra tutti è quello del riconoscere l’input scorretto, soprattutto perchè di input scorretti ne vengono scoperti in ogni momento di nuovi. Secondo la modifica protrebbe alterare la lunghezza ed il contenuto.
Anche la seconda presenta gli stessi inconvenienti della prima, quindi l’unica utilizzabile in modo sicuro è la terza. Di seguito è riportato un esempio pratico (in ASP) per ogni approccio possibile:
<%
'Esempio n.1
'Facciamo diventare corretto l'input sostituendo l'apostrofo con altri due
function controlla(input)
input = replace(input, "'", "''")
controlla = input
end function
%>
<%
'Esempio n.2
'Controlliamo che l'input sia corretto
function controlla2(input)
aScorretto = array( "select", "insert", "update", "delete", "drop",
"--", "'" )
controlla2 = true
for i = lbound(aScorretto) to ubound(aScorretto)
if ( instr( 1, input, aScorretto(i), vbtextcompare ) <> 0 )
then
controlla2 = false
exit function
end if
next
end function
%>
<%
'Esempio n.3
'Accettiamo solo l'input corretto
function controlla3(input)
strChars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
controlla3 = true
for i = 1 to len(input)
c = mid( input, i, 1 )
if ( InStr( strChars, c ) = 0 ) then
controlla3 = false
exit function
end if
next
end function
%>
Conclusioni
Come abbiamo visto validare gli input è molto importante, pena database in pericolo. Eseguire controlli non significa quindi sprecare tempo e risorse, ma rendere la nostra applicazione più affidabile e sicura.