Come posso evitare gli attacchi SQL injection nella mia applicazione ASP.NET?



Answers

Usa le istruzioni preparate (collega a un'esercitazione ASP.NET che utilizza istruzioni preparate nella sezione "Per aggiungere nodi per prodotti"). questo è tutto ciò che c'è da fare.

Bene, che o utilizzare un ORM, come Linq a SQL o NHibernate , utilizzano internamente istruzioni preparate.

Question

Devo evitare di essere vulnerabile all'iniezione SQL nella mia applicazione ASP.NET. Come potrei realizzare questo?




Come altri hanno già detto, non concatenare l'input dell'utente per creare istruzioni SQL dinamiche; usa sempre SQL parametrizzato quando usi SQL dinamico. Tuttavia, farò notare che questa regola si applica anche quando si crea un SQL dinamico all'interno di un processo memorizzato . Questo fatto è qualcosa che le persone spesso trascurano. Pensano di essere al sicuro perché "utilizzano procedure memorizzate".




Prova a utilizzare stored procedure e convalida l'input sui tuoi dati. Non utilizzare alcun SQL diretto come INSERT INTO ...




Non fidarti MAI dell'input dell'utente, convalidarlo sempre e utilizzare i parametri sql. Dovrebbe essere una base sufficiente per prevenire l'iniezione SQL.




Utilizza sempre solo query parametrizzate.




Utilizzare query parametrizzate e / o stored procedure e analizzare i parametri tramite parametri SQL. Non generare mai codice SQL concatenando le stringhe. Fai anche qualche lettura sull'iniezione SQL e sulla scrittura di codice sicuro, perché impedire l'iniezione SQL è solo una piccola parte della sicurezza. Ce ne sono molti altri (come XSS - Cross Site Scripting). Se un hacker vuole compromettere il tuo sito / applicazione, cercherà più di SQL injection.




Tutti dicono "Usa parametri". Dovremmo dirlo meno se non fosse così perversamente difficile.

Utilizza QueryFirst . La tentazione di concatenare viene rimossa e la strada giusta diventa la via più semplice. Puoi creare un parametro semplicemente digitando @myParam nel tuo SQL, lo strumento fa il resto.

disclaimer: Ho scritto QueryFirst




Non fidarti mai dell'input dell'utente : convalida tutte le voci della casella di testo utilizzando i controlli di convalida, le espressioni regolari, il codice e così via

Non utilizzare mai SQL dinamico : utilizzare SQL con parametri o stored procedure

Non connetterti mai a un database utilizzando un account a livello di amministratore : utilizza un account ad accesso limitato per connettersi al database

Non archiviare segreti in testo semplice : crittografare o hash password e altri dati sensibili; dovresti anche crittografare le stringhe di connessione

Le eccezioni dovrebbero divulgare informazioni minime : non rivelare troppe informazioni nei messaggi di errore; utilizzare CustomErrors per visualizzare informazioni minime in caso di errore non gestito; imposta il debug su false

Link utile su MSDN Stop SQL Injection






Links