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





sql-injection (14)


L'iniezione SQL si verifica perché la query al database viene costruita in tempo reale, ad esempio:

SELECT * From Table1 WHERE " + UserInput

UserInput potrebbe essere dannoso e contenere altre dichiarazioni che non si intendono.

Per evitarlo, è necessario evitare di concatenare la query insieme.

È possibile farlo utilizzando query parametrizzate: controllare l'oggetto DBCommand per il proprio particolare gusto DB.

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




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




Usa XSS Secured UrlEncode utilizzando Microsoft.Security.Application.AntiXss.UrlEncode e SQL injection non funzioneranno. Oppure È possibile utilizzare ASP.NET - JSON - Serializzazione e deserializzazione

Prova anche la tua applicazione con SiteDigger da Macfee Fre Tool.

Pochi altri sono da qui

.NET Security Toolkit v1.0 .NETMon v1.0 Validator.NET v1.0




Anche se la tua domanda è molto generica, si applicano sempre alcune regole:

  • Utilizzare query con parametri ( SqlCommand con SqlParameter ) e inserire l'input dell'utente nei parametri.
  • Non creare stringhe SQL con input utente non controllato.
  • Non dare per scontato che tu possa costruire una routine di sanificazione in grado di controllare l'input dell'utente per ogni tipo di malformazione. I casi limite sono facilmente dimenticati. Il controllo dell'input numerico può essere abbastanza semplice da metterti sul sicuro, ma per l'input di stringa basta usare i parametri.
  • Verifica le vulnerabilità di secondo livello: non creare stringhe di query SQL con valori di tabella SQL se questi valori sono costituiti da input dell'utente.
  • Utilizzare le stored procedure per incapsulare le operazioni del database.



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.




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




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




Comprendere che cos'è esattamente SQL Injection e quindi non scrivere mai nulla che sia vulnerabile ad esso.




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




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".




Utilizza sempre solo query parametrizzate.




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.




Scott Guthrie ha pubblicato un piccolo articolo decente su questo tempo fa. In esso, offre 5 suggerimenti per proteggersi:

  1. Non costruire istruzioni SQL dinamiche senza utilizzare un meccanismo di codifica dei parametri sicuro dal tipo. [...]

  2. Esegui sempre una verifica della sicurezza della tua applicazione prima di metterla in produzione e stabilisci un processo di sicurezza formale per rivedere tutto il codice ogni volta che effettui aggiornamenti. [...]

  3. Non archiviare mai dati sensibili in testo in chiaro all'interno di un database. [...]

  4. Assicurati di scrivere test di unità di automazione che verifichino in modo specifico il tuo livello di accesso ai dati e l'applicazione contro gli attacchi di SQL Injection. [...]

  5. Blocca il database in modo che solo l'applicazione Web acceda al set di autorizzazioni minime necessarie per funzionare. [...]

Fa un lavoro decente nello spiegare perché questi sono importanti, e collega anche a molte altre risorse ...




Root Cause # 1 - The Delimiter Problem

L'iniezione SQL è possibile perché utilizziamo le virgolette per delimitare le stringhe e anche per essere parti di stringhe, rendendo impossibile interpretarle a volte. Se avessimo dei delimitatori che non potevano essere usati nei dati di stringa, SQL injection non sarebbe mai avvenuto. Risolvere il problema del delimitatore elimina il problema di SQL injection. Le query di struttura lo fanno.

Causa principale n. 2 - Natura umana, le persone sono astute e alcune persone furbe sono dannose e tutte le persone commettono errori

L'altra causa principale dell'iniezione sql è la natura umana. Le persone, inclusi i programmatori, commettono errori. Quando si commette un errore in una query strutturata, non rende il sistema vulnerabile a SQL injection. Se non si utilizzano query strutturate, gli errori possono generare vulnerabilità di SQL injection.

In che modo le query strutturate risolvono le cause principali dell'iniezione SQL

Query strutturate Risolvi il problema del delimitatore, inserendo i comandi sql in una dichiarazione e inserendo i dati in un'istruzione di programmazione separata. Le dichiarazioni di programmazione creano la separazione necessaria.

Le query strutturate aiutano a prevenire errori umani dalla creazione di falle di sicurezza critiche. Riguardo agli umani che commettono errori, SQL injection non può accadere quando vengono utilizzate query di struttura. Esistono modi per prevenire l'iniezione di sql che non comportano query strutturate, ma il normale errore umano in questi approcci porta di solito ad una certa esposizione a SQL injection. Le query strutturate sono sicure da SQL injection. Puoi fare tutti gli errori del mondo, quasi, con query strutturate, come qualsiasi altra programmazione, ma nessuno di quelli che puoi fare può essere trasformato in un ssstem preso da SQL injection. Questo è il motivo per cui alla gente piace dire che questo è il modo giusto per prevenire l'iniezione sql.

Quindi, ecco qua, le cause di SQL injection e le query strutturate in natura che le rendono impossibili quando vengono utilizzate.





.net asp.net sql security sql-injection