1. Čo je SQL injection? Takzvaná SQL injekcia spočíva v vložení SQL príkazov do formulára na odoslanie alebo zadanie dotazovacieho reťazca požiadavky na doménové meno alebo stránku, a nakoniec oklamanie servera, aby vykonal škodlivé SQL príkazy. Zadaním parametrov na vytvorenie šikovných SQL príkazov môžete úspešne získať požadované dáta.
2. SQL typ injekcie Konkrétne možno SQL injection rozdeliť do piatich kategórií, a to: číselná injekcia, znaková injekcia, vyhľadávacia injekcia (like), in injection a sentence connection injection. Z pohľadu aplikácie by sa mala venovať osobitná pozornosť SQL injekcii do IP, vyhľadávaniu, dávkovému mazaniu a prenosu z databázy do databázy.
3. Ako aplikovať injekciu
Pozrime sa na typický príklad
SqlCommand cmd = nový SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + PassWord + "'", conn); Keďže neexistuje overenie pre UserName a Password, ak UserName="admin" ALEBO 1=1--" Vykonaný SQL príkaz sa stáva:
VYBERTE * Z PE_USERS KDE UserName='admin' ALEBO 1=1—' A UserPassword='' To vedie k SQL injekcii a podmienky sú vždy splnené, takže sa môžete úspešne prihlásiť aj bez hesla.
4. Ako zabrániť SQL injekcii
1. Filtrovať alebo konvertovať podozrivé reťazce
SQL injection sa zabraňuje písaním funkcií, ktoré filtrujú alebo konvertujú nebezpečné reťazce, a potom používajú GLOBAL.ASAX alebo prepisujú kontextové inštancie
Tu je príklad
public static bool 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 return false; 6 Preach (reťazec I vo Worde. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 návratov true; 11 } 12 } 13 return false (falošné); 14 }
2. Global.asax
chránený void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Prechádzanie parametrov príspevku, okrem skrytých domén 4 predmluva (String I v tomto. Žiadosť. Formulár) 5 { 6 if(i=="__VIEWSTATE")pokračovať; 7 this.goErr(this. Request.Form.ToString()); 8 } 9 // Prejdite parameter Dostať. 10 preach(String I v tomto. Request.QueryString) 11 { 12 this.goErr(this. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 if(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 toto. Response.end() 5 } Výhody: Tento aspekt používa väčšina začiatočníkov na zabránenie SQL injection a zdá sa, že vo väčšine prípadov dobre funguje na zabránenie injectionu.
Nevýhody: 1. Filtruje niektoré znaky, ktoré pôvodne neboli použité na injekciu, čo spôsobuje nečakané problémy. Napríklad, ak meno člena fóra obsahuje rovnaké znaky ako filtrované znaky, spôsobí to nečakané problémy a ťažkosti.
2. Filtrovanie alebo konverzia je potrebná zakaždým, čo znižuje efektivitu programu
2. Použitie uložených procedúr pre parametrické dotazy
Hlavným účelom SQL injection je vykonávať škodlivé príkazy v databáze odoslaním škodlivého SQL kódu. Preto, pokiaľ sú SQL príkazy spracované pred vykonaním, SQL injection je možné efektívne zabrániť. Parametrizované dotazy môžu účinne zabrániť injekcii SQL.
Príklad
const string strSql = "SELECT * FROM [PE_Users] KDE UserName = @UserName"; Parameters parms = nové parametre ("@UserName", DbType.String, userName); Existuje parameter @UserName vyššie, pomocou objektu Prarmeter, cez ktorý sa parameter pridáva k objektu príkazu, To vám dá parametrizovaný dotaz. Ako bolo popísané vyššie, ADO.NET posiela SQL Serveru nasledujúci SQL príkaz:
Exec sp_executesql N 'vyber * z [pe_users], kde používateľské meno=@username ',N '@username nvarchar(20) ',@username=N 'meno' SQL Server nahradí @username reťazcom "name" pred vykonaním dotazu. Predpokladajme, že máte nasledujúce vstupy:
'union select @@version,null,null— Generovaný SQL príkaz vyzerá takto:
Exec sp_executesql N 'vyber * z [pe_users], kde používateľské meno=@username ',N '@username nvarchar(20) ',@username=N ''' union select @@version,null,null--' Vidíte, že ADO.NET uniká vstupu.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopírovať kód
DbTye alebo SqlDbType môžu byť rôzne typy dát. Môžete si vybrať podľa typu údajov. Na niektorých miestach sa dá použiť aj na určenie dĺžky parametra: int size. To tiež účinne zabraňuje pretečeniu databázy a SQL poznámkam Možnosť vstúpiť. Výhody: Efektívne zabraňuje SQL injection. Nevýhody: Niektoré miesta sa nedajú aplikovať, napríklad v.
3. Whitelist
Popis: Niektoré známe rozsahy parametrov je možné spracovať vo forme bielych zoznamov, ktoré môžu zabrániť SQL injekcii a dotazom Nesprávne, napríklad: zoradite podľa + názvu stĺpca, keď sa názov stĺpca odovzdá vo forme parametra, môže sa najskôr zostaviť whitelist na posúdenie parametra či je číslo v bielom zozname, a potom dotaz, inak bude spracované nesprávne. Výhody: bezpečné a spoľahlivé Nevýhody: Malý rozsah aplikácií |