1. Co je SQL injection? Takzvaná SQL injekce spočívá v vložení SQL příkazů do formuláře, aby se odeslal nebo zadal dotazovací řetězec doménového jména nebo požadavku na stránku, a nakonec oklamal server, aby spustil škodlivé SQL příkazy. Zadáním parametrů pro vytvoření chytrých SQL příkazů můžete úspěšně získat požadovaná data.
2. SQL typ injekce Konkrétně lze SQL injekci rozdělit do pěti kategorií, a to: injekce čísel, injekce znaků, injekce vyhledávání (like), in injection a injekce větných spojů. Z pohledu aplikace je třeba věnovat zvláštní pozornost SQL injekci do IP, vyhledávání, dávkovému mazání a přenosu z databáze do databáze.
3. Jak aplikovat injekci
Podívejme se na typický příklad
SqlCommand cmd = nový SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' A UserPassword = '" + Heslo + "'", conn); Protože neexistuje ověření pro UserName a Password, pokud UserName="admin" NEBO 1=1--" Vykonáný SQL příkaz se stává:
VYBERTE * Z PE_USERS KDE UserName='admin' NEBO 1=1—' A UserPassword='' To vede k SQL injection a podmínky jsou vždy splněné, takže se můžete úspěšně přihlásit i bez hesla.
4. Jak zabránit injekci SQL
1. Filtrovat nebo převádět podezřelé řetězce
SQL injection je zabráněno psaním funkcí, které filtrují nebo převádějí nebezpečné řetězce, a poté používají GLOBAL.ASAX nebo přepisují kontextové instance
Tady je pří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 (nepravdivé); 6 předeř (řetězec i ve slově. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 vrácených true; 11 } 12 } 13 return false (nepravdivé); 14 }
2. Global.asax
chráněný void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Procházení parametrů příspěvku, kromě skrytých domén 4 předeřáze (struna I v tomto. Žádost.Formulář) 5 { 6 if(i=="__VIEWSTATE")pokračuje; 7 toto.goErr(tohle. Request.Form.ToString()); 8 } 9 // Projděte parametr Get. 10 předeřáz (String I v tomto. Request.QueryString) 11 { 12 toto.gErr(tohle. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 if(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 tohle. Response.end() 5 } Výhody: Tento aspekt používá většina začínajících programátorů k zabránění SQL injectionu a zdá se, že ve většině případů dobře funguje k prevenci injection.
Nevýhody: 1. Filtruje některé znaky, které původně nebyly použity pro injekci, což způsobí neočekávané problémy. Například pokud jméno člena fóra obsahuje stejné znaky jako filtrované znaky, může to způsobit nečekané problémy a potíže.
2. Filtrování nebo konverze je vyžadováno pokaždé, což snižuje efektivitu programu
2. Použití uložených procedur pro parametrické dotazy
Hlavním účelem SQL injection je provádět škodlivé příkazy v databázi odesíláním škodlivého SQL kódu. Proto lze SQL injekci, pokud jsou SQL příkazy zpracovány před vykonáním, účinně zabránit. Parametrizované dotazy mohou účinně zabránit injekci SQL.
Příklad
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parametry parms = nové parametry ("@UserName", DbType.String, uživatelské jméno); Existuje parametr @UserName výše, pomocí objektu Prarmeter, kterým je parametr přidán k objektu příkazu, To vám dá parametrizovaný dotaz. Jak bylo popsáno výše, ADO.NET odesílá SQL Serveru následující SQL příkaz:
Exec sp_executesql N 'vyberte * z [pe_users], kde uživatelské jméno=@username ',N '@username nvarchar(20) ',@username=N 'jméno' SQL Server nahrazuje @username řetězcem "jméno" před vykonáním dotazu. Předpokládejme, že máte následující vstupy:
'union select @@version,null,null— Generovaný SQL příkaz vypadá takto:
Exec sp_executesql N 'vyberte * z [pe_users], kde uživatelské jméno=@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írovat kód
DbTye nebo SqlDbType mohou být různé datové typy. Můžete si vybrat podle typu dat. Na některých místech lze také použít k určení délky parametru: velikost int. To také účinně zabraňuje přetečení databáze a SQL poznámkám Možnost vstupu. Výhody: Účinně zabraňuje SQL injection. Nevýhody: Některá místa nelze aplikovat, například v.
3. Whitelist
Popis: Některé známé rozsahy parametrů lze zpracovávat ve formě whitelistů, což může zabránit injekci SQL a dotazování Špatně, například: seřaďte podle + jména sloupce, když je název sloupce předán ve formě parametru, lze formulovat whitelist, který parametr nejprve posoudí zda je číslo v bílé listině, a pak dotazovat, jinak bude zpracováno nesprávně. Výhody: bezpečné a spolehlivé Nevýhody: Malý rozsah aplikací |