2009-05-29 13 views
10

L'utilizzo di SqlParameters è un metodo consigliato per impedire l'SQL Injection nelle query del database. Dove posso trovare il codice/funzione che sanifica internamente questi parametri? Mi piacerebbe riutilizzare questa funzione in una mia implementazione personalizzata. Ho provato a trovarlo usando Reflector, ma non ho avuto successo.In che modo SqlCommand disinfetta i parametri?

+0

Grande domanda: è importante capire quanto sia profonda la sicurezza fornita dall'utilizzo di query parametrizzate. – RedFilter

risposta

24

Protegge contro SQL Injection, non XSS e non esiste alcun codice o funzione che sanifica i dati dei parametri.

La protezione viene eseguita trasmettendo i valori dei parametri al server separatamente dalla stringa di query, in modo che i valori siano mai sostituiti direttamente nell'istruzione sql.

Così, invece di sql server in esecuzione o meno così:

SELECT * FROM [table] WHERE [column] = ParameterValue 

E 'più come se correva qualcosa di simile:

DECLARE @ParamValue int 
    -- //@ParamValue variable is populated from the framework in a safe way 
SELECT * FROM [table] WHERE [column] = @ParamValue 

Questo è più veloce e molto più sicuro e robusto di una funzione questo dovrebbe valutare i dati dei parametri. Tale funzione dovrebbe essere molto complessa (leggi: soggetto a errori) per gestire cose come custom escape characters e miglioramenti futuri.

Questo lato preciso fa il punto sull'intero problema: i dati sono dati, il codice è codice e mai i due devono incontrarsi.


Il tuo commento all'altro, ora cancellato, risposta:

Se mi passa nel valore O'Rourke, che codifica per essere O''Rourke in modo che non si rompe la query. Corretta?

No, non è corretto. La variabile viene creata direttamente da un blocco di dati, quindi non è necessaria alcuna escaping o codifica speciale.

+0

OK, ha senso, grazie. "// @ La variabile ParamValue viene popolata dal framework in modo sicuro" come viene popolato in un modo sicuro allora? –

+0

Non è sql - la variabile viene creata da sql server dal blocco _data_ trasmesso dal client, ma è conservata in un segmento di dati e mai trattata come codice, quindi i dati non devono essere sottoposti a escape o codificati. –

+0

Conosci qualche letteratura dettagliata riguardo a questo? Mi piacerebbe davvero capire l'intero processo. –

Problemi correlati