1. Ce este injecția SQL? Așa-numita injecție SQL este de a introduce comenzi SQL în formularul formularului pentru a trimite sau introduce șirul de interogare al cererii numelui de domeniu sau a paginii și, în final, păcălește serverul să execute comenzi SQL malițioase. Prin trimiterea parametrilor pentru a construi instrucțiuni SQL ingenioase, poți obține cu succes datele dorite.
2. SQL tip de injecție Mai exact, injecția SQL poate fi împărțită în cinci categorii, și anume: injecția de numere, injecția de caractere, injecția de căutare (asemănătoare), injecția și injecția prin conexiune de propoziții. Din punct de vedere al aplicației, ar trebui acordată o atenție specială injectării SQL în IP, căutare, ștergere în loturi și transfer de la o bază de date la alta.
3. Cum să injectezi
Să vedem un exemplu tipic
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + WordPassWord + "'", conn); Deoarece nu există validare pentru UserName și PassWord, dacă UserName="admin' OR 1=1--" Instrucțiunea SQL executată devine:
SELECTEAZĂ * DIN PE_USERS UNDE NumeUtilizator='admin' SAU 1=1—' ȘI UserPassword='' Acest lucru duce la injectarea SQL, iar condițiile sunt întotdeauna adevărate, astfel încât poți să te conectezi cu succes fără parolă.
4. Cum să previi injecția SQL
1. Filtrarea sau conversia șirurilor suspecte
Injectarea SQL este prevenită prin scrierea funcțiilor care filtrează sau convertesc șiruri periculoase, apoi utilizează GLOBAL.ASAX sau rescrie instanțele contextului
Iată un exemplu
bool static public SqlFilter2(string InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 returnează false; 6 forach (șir i în cuvânt. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 returnează adevărul; 11 } 12 } 13 returnează false; 14 }
2. Global.asax
Vid protejat Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Parcurgerea parametrilor Postului, cu excepția domeniilor ascunse 4 foreach (firul i în acesta). Solicitare.Formular) 5 { 6 dacă(i=="__VIEWSTATE")continuă; 7 asta.goErr (asta. Request.Form.ToString()); 8 } 9 // Traversează parametrul Get. 10 forach (șirul i în asta). Request.QueryString) 11 { 12 asta.goErr (asta. Request.QueryString.ToString()); 13 } 14 } vid privat goErr (string tm) 2 { 3 dacă (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 asta. Răspuns.sfârșit() 5 } Pro: Acest aspect este folosit de majoritatea programatorilor începători pentru a preveni injecția SQL și pare să funcționeze bine pentru a preveni injecția în majoritatea cazurilor.
Dezavantaje: 1. Va filtra unele caractere care nu au fost folosite inițial pentru injecție, cauzând probleme neașteptate. De exemplu, dacă numele unui membru al forumului conține aceleași caractere ca și cele filtrate, acest lucru va cauza unele probleme și probleme neașteptate.
2. Filtrarea sau conversia este necesară de fiecare dată, ceea ce reduce eficiența programului
2. Utilizarea procedurilor stocate pentru interogări parametrice
Scopul principal al injecției SQL este de a executa comenzi malițioase în baza de date prin trimiterea codului SQL malițios. Prin urmare, atâta timp cât comenzile SQL sunt procesate înainte de execuție, injecția SQL poate fi prevenită eficient. Interogările parametrizate pot preveni eficient injectarea SQL.
Exemplu
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parameters parms = new Parameters ("@UserName", DbType.String, userName); Există un parametru @UserName mai sus, folosind obiectul Prarmeter, prin care parametrul este adăugat obiectului Comandă, Aceasta îți oferă o interogare parametrizată. Așa cum s-a descris mai sus, ADO.NET trimite următoarea instrucțiune SQL către SQL Server:
Exec sp_executesql N 'selectează * din [pe_users] unde username=@username ',N '@username nvarchar(20) ',@username=N 'nume' SQL Server înlocuiește @username cu șirul "name" înainte de a executa interogarea. Să presupunem că ai următoarele inputuri:
'uniune select @@version, null, null— Instrucțiunea SQL generată arată astfel:
Exec sp_executesql N 'selectează * din [pe_users] unde username=@username ',N '@username nvarchar(20) ',@username=N ''' selecție de uniune @@version,null,null--" Poți vedea că ADO.NET scapă din input.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Cod de copiere
DbTye sau SqlDbType pot fi o varietate de tipuri de date. Poți alege în funcție de tipul tău de date. În unele locuri, poate fi folosit și pentru a specifica lungimea parametrului: mărimea int. Acest lucru previne, de asemenea, efectiv suprasolicitările bazei de date și notițele SQL Posibilitatea de a intra. Pro: Previne eficient injectarea SQL. Dezavantaje: Unele locuri nu pot fi aplicate, cum ar fi în.
3. Lista albă
Descriere: Unele intervale de parametri cunoscute pot fi gestionate sub forma unor liste albe, care pot preveni injectarea SQL și interogarea Greșit, de exemplu: ordonează după + numele coloanei, când numele coloanei este transmis sub forma unui parametru, se poate formula o listă albă pentru a judeca mai întâi parametrul dacă numărul este în lista albă și apoi interogează, altfel va fi procesat incorect. Avantaje: sigur și de încredere Dezavantaje: Gama restrânsă de aplicații |