In risposta alla tua domanda diretta:questo codice impedisce l'iniezione di SQL:No
Ecco la prova:spingi questa stringa attraverso il metodo PrepareString:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Ho modificato il metodo GetRecord che hai pubblicato per restituire la stringa SQL completamente preparata anziché ottenere il record dal database:
Console.WriteLine(GetRecord(output))
E questo è l'output
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Aggiungi 1 riga di codice extra:
My.Computer.Clipboard.SetText(input)
E hai la stringa di cui hai bisogno copiata direttamente negli appunti da incollare nel campo di input sul sito Web per completare la tua SQL injection:
'; Drop Table TableName; - -
[Nota che i caratteri di controllo sono stati omessi dall'output del post da StackOverflow, quindi dovrai seguire l'esempio di codice per creare il tuo output]
Dopo che il metodo PrepareString è stato eseguito, avrà lo stesso identico output:il codice ASCII Chr(8) è il backspace che rimuoverà il "'" extra che stai aggiungendo al mio che chiuderà la tua stringa e quindi sono libero di aggiungere quello che voglio alla fine. Il tuo PrepareString non vede il mio -- perché sto effettivamente usando -- con un carattere backspace per rimuovere lo spazio.
Il codice SQL risultante che stai creando eseguirà quindi la mia istruzione Drop Table senza ostacoli e ignorerà prontamente il resto della tua query.
La cosa divertente di questo è che puoi usare caratteri non stampabili per aggirare praticamente qualsiasi controllo di carattere che puoi inventare. Quindi è più sicuro utilizzare query parametrizzate (che non è quello che hai chiesto, ma è il percorso migliore per evitarlo).