Ogni volta che si costruisce una stringa SQL concatenando stringhe, esiste la possibilità di un attacco di iniezione, non importa quanto sicuro si pensa accesso a tali stringhe sono. Per quanto ne sappia, qualcuno potrebbe eseguire la tua app all'interno di un debugger, inserire un breakpoint sul risultato di QuotedStr()
e modificarne il contenuto prima di consentire a Format()
di vederlo.
Uso dei parametri SQL reale è il modo più sicuro per andare. Non solo evita le iniezioni, ma consente anche al motore SQL di decidere il modo migliore per formattare i parametri in base alle proprie esigenze, quindi non devi preoccuparti di formattare i valori nel tuo codice, funziona bene con caratteri fortemente tipizzati lingue (come Delphi). Per non parlare dei vantaggi in termini di prestazioni derivanti dalla possibilità di preparare in anticipo l'istruzione SQL sul server prima di eseguirla nel codice, anche più volte, riducendo drasticamente il traffico tra client e server e aumentando le prestazioni complessive.
var
sCustomer : string
begin
AdoSql.CommandText := 'Select SUM(value) result from invoices where customer=:Customer';
AdoSql.Prepared := True;
...
AdoSql.Parameters['Customer'].Value := sCustomer;
AdoSql1.ExecSQL;
...
AdoSql.Parameters['Customer'].Value := sCustomer;
AdoSql1.ExecSQL;
...
AdoSql.Prepared := False;
end;
fonte
2012-06-20 22:11:56
penso titolo avrebbe dovuto essere 'funzione QuotedStr vs Parametri in scenari di SQL injection?', Ma cambiarla, si romperà alcune risposte qui. il * problema * qui riguarda 'QuotedStr' e non' Format'. – kobik