Per iniziare, sono consapevole che le query con parametri sono l'opzione migliore, ma mi sto chiedendo cosa rende vulnerabile la strategia che presento. La gente insiste che la soluzione sottostante non funziona, quindi sto cercando un esempio del perché non lo farebbe.In che modo il risanamento che sfugge alle virgolette singole può essere sconfitto dall'iniezione SQL in SQL Server?
Se SQL dinamico è incorporato nel codice utilizzando il seguente escape prima di essere inviato a un server SQL, quale tipo di iniezione può sconfiggere questo?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
Una domanda simile è stato risposto here, ma non credo nessuna delle risposte sono applicabili qui.
L'escape della quota singola con una "\" non è possibile in SQL Server.
ritengo SQL contrabbando con Unicode (illustrato here) verrebbe ostacolato dal fatto che la stringa prodotta è contrassegnato come Unicode dal N precede la sola offerta. Per quanto ne so, non ci sono altri set di caratteri che SQL Server traduca automaticamente in una singola citazione. Senza una singola citazione senza escape, non credo che l'iniezione sia possibile.
Non credo Il troncamento di stringa è anch'esso un vettore valido. SQL Server certamente non eseguirà il troncamento poiché la dimensione massima per un nvarchar
è 2 GB according to microsoft. Una stringa da 2 GB non è fattibile nella maggior parte delle situazioni e impossibile nella mia.
Secondo Ordine iniezione potrebbe essere possibile, ma è possibile se:
- Tutti i dati che vanno in cui il database è sterilizzate con il metodo di cui sopra
- valori dalla banca dati non vengono mai aggiunti in SQL dinamico (perché lo faresti mai comunque, quando puoi semplicemente fare riferimento al valore della tabella nella parte statica di qualsiasi stringa SQL dinamica?).
Non sto suggerendo che sia meglio o un'alternativa all'utilizzo di query con parametri, ma voglio sapere come ciò che ho delineato è vulnerabile. Qualche idea?
No. Sei ancora suscettibile di attacchi in forma: ' "SELECT * FROM MyTable WHERE campo =" + userInput' quando' 'userInput' è 0 ; DROP TABLE OhNo; '. – Yuck
Questo non ha senso. Nell'esempio sopra, l'input dell'utente verrebbe sterilizzato su N'0; DROP TABLE OhNo; ' prima di essere mai giustiziato. – GBleaney
Questo vale solo per la sanitizzazione di variabili di stringa. Cose come "int" non hanno bisogno di essere sanificate se vengono lanciate come int prima di essere aggiunte alla query. In ogni caso, sto solo chiedendo di disinfettare le stringhe in questo momento. Inoltre, non c'è bisogno di essere maleducati qui. Se riesci a pensare a un modo in cui questo non è sicuro, mi piacerebbe saperlo. – GBleaney