Il post seguente fa parte del progetto SQLStringBuilder. Per le ultime versioni del codice sorgente si consiglia di prelevare il codice dal CVS.

Se dobbiamo lavorare con delle stringhe SQL in un ambiente in cui la sicurezza è fondamentale, non possiamo assolutamente permetterci di mandare in pasto al MySQL stringhe senza prima averle ripulite per bene. Quella che può sembrare un esagerazione di un programmatore pazzo invece si reputa un enorme falla di sicurezza se non implementata
Se per esempio diamo in pasto la seguente SQL al db: string sql = "INSERT INTO table VALUES('" + textBoxNomeCliente.Text + "')";

dove textBoxNomeCliente è il text box riempito dall’utente, i rischi di sicurezza sono praticamente enormi. Cosa succederebbe se per esempio il cliente nel textbox scrivesse:

Ti sto per fottere il DB...'); DROP TABLE "tabellaConDatiImportantissimi"; INSERT INTO table VALUES('ti ho fottuto il DB haha!

La query in pratica diventerebbe:

INSERT INTO table VALUES('Ti sto per fottere il DB...'); DROP TABLE "tabellaConDatiImportantissimi"; INSERT INTO table VALUES('ti ho fottuto il DB haha!')

Bello vero?? In pratica l’utente malintenzionato può facilmente eseguire tutte le query che vuole, in questo caso cancellando completamente una tabella.

Questo caso probabilmente può sembrare una paranoia mentale se stiamo parlando di un applicazione eseguita in locale su un computer, ma la cosa può diventare seria se stiamo parlando di un applicazione server o ancora meglio di un Server Web!! Per evitare di farsi distruggere il DB da utenti malintenzionati conviene creare un metodo in cui si ripulisce la stringa SQL:

Codice c#:

Utils.GetSQLCleanString(string sql)
{
str = str.Replace("\\", "\\\\");
str = str.Replace("'", "\\'");
return str;
}

Codice php:

function GetSQLCleanString($sql)
{
$search = array("\\", "''");
$replace = array("\\\\", "\\'");
return str_replace($search, $replace, $sql);
}

Con questo metodo trasformiamo gli eventuali \ solitari (il backslash è un carattere che seguito da un altra lettera serve ad identificare caratteri speciali, per esempio l’accapo) in \\, che per il SQL significa \, e gli eventuali apici ‘ in \’. Con la seconda sostituzione evitiamo che l’utente malintenzionato possa scrivere un apice nel valore, permettendogli di chiudere la query e aprirne un altra: l’apice infatti viene sostituito con \’, che in pratica è un apice che non viene interpretato dal SQL come un apice di chiusura o apertura di una stringa, ma come un apice all’interno della stringa. Il codice per costruire
la query diventa:

string sql = "INSERT INTO table VALUES('" + Utils.GetSQLCleanString(textBoxNomeCliente.Text) + "')";

Che stavolta darebbe come risultato:

INSERT INTO table VALUES('Ti sto per fottere il DB...\'); DROP TABLE "tabellaConDatiImportantissimi"; INSERT INTO table VALUES(\'ti ho fottuto il DB haha!\');')

E quindi invece di eseguire le tre query, sul campo della tabella verrà inserito il valore che l’utente ha inserito nel textbox :)


Se sei interessato a questo post, potresti anche provare a leggere:

    No related posts