Mi rendo conto che le query SQL con parametri sono il modo ottimale per disinfettare l'input dell'utente quando si creano query che contengono input dell'utente, ma mi chiedo cosa c'è di sbagliato nel prendere l'input dell'utente e sfuggire a qualsiasi virgoletta singola e circondare l'intera stringa con virgolette singole. Ecco il codice:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Qualsiasi virgoletta singola immessa dall'utente viene sostituita da virgolette singole doppie, il che elimina la possibilità per gli utenti di terminare la stringa, quindi qualsiasi altra cosa che possano digitare, come punti e virgola, segni di percentuale, ecc., Farà parte della stringa e non effettivamente eseguito come parte del comando.
Stiamo usando Microsoft SQL Server 2000, per il quale credo che la virgoletta singola sia l'unico delimitatore di stringa e l'unico modo per sfuggire al delimitatore di stringa, quindi non c'è modo di eseguire nulla in cui l'utente digita.
Non vedo alcun modo per lanciare un attacco di iniezione SQL contro questo, ma mi rendo conto che se fosse a prova di proiettile come sembra a me qualcun altro ci avrebbe già pensato e sarebbe pratica comune.
Cosa c'è che non va in questo codice? C'è un modo per ottenere un attacco di iniezione SQL oltre questa tecnica di sanificazione? Un input utente di esempio che sfrutta questa tecnica sarebbe molto utile.
AGGIORNARE:
Non conosco ancora alcun modo per lanciare efficacemente un attacco di iniezione SQL contro questo codice. Alcune persone hanno suggerito che una barra rovesciata sfuggirebbe a una virgoletta singola e lascerebbe l'altra per terminare la stringa in modo che il resto della stringa venga eseguito come parte del comando SQL, e mi rendo conto che questo metodo funzionerebbe per iniettare SQL in un database MySQL, ma in SQL Server 2000 l'unico modo (che sono stato in grado di trovare) di sfuggire a una virgoletta singola è con un'altra virgoletta singola; le barre rovesciate non lo faranno.
E a meno che non ci sia un modo per fermare l'escaping della virgoletta singola, nessuno degli altri input dell'utente verrà eseguito perché tutto verrà preso come una stringa contigua.
Capisco che ci sono modi migliori per disinfettare l'input, ma sono davvero più interessato a capire perché il metodo che ho fornito sopra non funzionerà. Se qualcuno conosce un modo specifico per montare un attacco di iniezione SQL contro questo metodo di sanificazione mi piacerebbe vederlo.