1. Cos'è l'iniezione SQL? La cosiddetta iniezione SQL consiste nell'inserire comandi SQL nel modulo per inviare o inserire la stringa di query del nome di dominio o della richiesta di pagina, e infine ingannare il server facendogli eseguire alcuni comandi SQL dannosi. Inviando parametri per costruire istruzioni SQL intelligenti, puoi ottenere con successo i dati desiderati.
2. SQL tipo di iniezione In particolare, l'iniezione SQL può essere suddivisa in cinque categorie, ovvero: iniezione di numeri, iniezione di caratteri, iniezione di ricerca (like), iniezione in e iniezione di connessione di frase. Dal punto di vista applicativo, bisogna prestare particolare attenzione all'iniezione SQL nell'IP, alla ricerca, alla cancellazione batch e al trasferimento da database a database.
3. Come iniettare
Vediamo un esempio tipico
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' And UserPassword = '" + PassWord + "'", conn); Poiché non c'è validazione per UserName e PassWord, se UserName="admin' OR 1=1--" L'istruzione SQL eseguita diventa:
SELEZIONA * DA PE_USERS DOVE UserName='admin' O 1=1—' E UserPassword='' Questo porta all'iniezione SQL, e le condizioni sono sempre valide, quindi puoi accedere con successo senza password.
4. Come prevenire l'iniezione SQL
1. Filtrare o convertire stringhe sospette
L'iniezione SQL è prevenuta scrivendo funzioni che filtrano o convertono stringhe pericolose, e poi si utilizza GLOBAL.ASAX o riscrivo istanze contestuali
Ecco un esempio
bool statico pubblico SqlFilter2(stringa InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 se(InText==null) 5 restituire falso; 6 forach (stringa i in parola. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 ritornano veri; 11 } 12 } 13 risponde falso; 14 }
2. Global.asax
Protected void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Attraversare i parametri del Post, eccetto per i domini nascosti 4 forach (stringa i in questo). Richiesta.Modulo) 5 { 6 se(i=="__VIEWSTATE")continua; 7 questo.vaErr (questo. Request.Form.ToString()); 8 } 9 // Attraversa il parametro Get. 10 di forach (stringa i in questo). Request.QueryString) 11 { 12 this.goErr(this. Request.QueryString.ToString()); 13 } 14 } vuoto privato goErr(stringa tm) 2 { 3 if(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 questo. Response.end() 5 } Pro: Questo aspetto è usato dalla maggior parte dei programmatori principianti per prevenire l'iniezione SQL, e sembra funzionare bene per prevenire l'iniezione nella maggior parte dei casi.
Svantaggi: 1. Filtra alcuni caratteri che non erano stati originariamente usati per l'iniezione, causando problemi inaspettati. Ad esempio, se il nome di un membro del forum contiene gli stessi caratteri dei caratteri filtrati, questo causerà alcuni problemi e problemi imprevisti.
2. È necessario filtrare o convertire ogni volta, riducendo l'efficienza del programma
2. Utilizzare procedure memorizzate per query parametriche
Lo scopo principale dell'iniezione SQL è eseguire comandi dannosi nel database inviando codice SQL malevolo. Pertanto, finché i comandi SQL vengono elaborati prima dell'esecuzione, l'iniezione SQL può essere efficacemente prevenuta. Le query parametrizzate possono efficacemente prevenire l'iniezione SQL.
Esempio
const stringa strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parametri parms = nuovi Parametri("@UserName", DbType.String, userName); Esiste un parametro @UserName sopra, usando l'oggetto Prarmeter, attraverso il quale il parametro viene aggiunto all'oggetto Comando, Questo ti dà una query parametrizzata. Come descritto sopra, ADO.NET invia la seguente istruzione SQL a SQL Server:
Exec sp_executesql N 'seleziona * da [pe_users] dove username=@username ',N '@username nvarchar(20) ',@username=N 'nome' SQL Server sostituisce @username con la stringa "name" prima di eseguire la query. Supponiamo di avere i seguenti input:
'unione seleziona @@version, nullo, nullo— L'istruzione SQL generata appare così:
Exec sp_executesql N 'seleziona * da [pe_users] dove username=@username ',N '@username nvarchar(20) ',@username=N ''' unione seleziona @@version,null,null--' Puoi vedere che ADO.NET sfugge all'input.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Copia codice
DbTye o SqlDbType possono essere una varietà di tipi di dati. Puoi scegliere in base al tipo di dato. In alcuni luoghi, può anche essere usato per specificare la lunghezza del parametro: dimensione int. Questo previene efficacemente anche i sovrappunti di database e le note SQL Possibilità di entrare. Pro: Previene efficacemente l'iniezione SQL. Svantaggi: Alcuni luoghi non possono essere applicati, come in.
3. Whitelist
Descrizione: Alcuni intervalli di parametri noti possono essere gestiti sotto forma di whitelist, che possono prevenire l'iniezione e l'interruzione di SQL Sbagliato, ad esempio: ordinare per + nome colonna, quando il nome della colonna viene passato sotto forma di parametro, si può formulare una whitelist per giudicare prima il parametro se il numero è nella whitelist, e poi interroga, altrimenti verrà elaborato in modo errato. Vantaggi: sicuro e affidabile Svantaggi: Ristretta gamma di applicazioni |