1. Mi az SQL injekció? Az úgynevezett SQL injekció az, hogy SQL parancsokat helyezünk be az űrlapűrlapba, hogy beküldjük vagy beírjuk a domain név vagy oldalkérés lekérdezési láncszálát, majd végül becsapjuk a szervert, hogy végrehajtson néhány rosszindulatú SQL parancsot. Ha paramétereket küldünk be okos SQL utasítások létrehozásához, sikeresen megszerezheted a kívánt adatokat.
2. SQL injekció típusa Konkrétan az SQL injekció öt kategóriába sorolható: számbeépítés, karakterinjekció, keresési injekció (like), injekció és mondatkapcsolat injekció. Az alkalmazás szempontjából különös figyelmet kell fordítani az SQL injekciójára az IP-ben, keresésre, köteges törlésre és az adatbázisról adatbázisba történő átvitelre.
3. Hogyan kell befecskendíteni
Nézzünk egy tipikus példát
SqlCommand cmd = új SqlCommand ("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + PassWord + "'", conn); Mivel nincs validáció a UserName és a PassWord esetében, ha UserName="admin' OR 1=1--" A végrehajtott SQL utasítás a következőképpen alakul ki:
VÁLASSZ * FROM PE_USERS WHERE UserName='admin' OR 1=1—' AND UserPassword='' Ez SQL befecskendezést eredményez, és a feltételek mindig érvényesek, így jelszó nélkül is sikeresen be tudsz jelentkezni.
4. Hogyan lehet megakadályozni az SQL befecskendezését
1. Gyanús sorozatok szűrése vagy átalakítása
Az SQL injekciót megakadályozzuk, ha olyan függvényeket írunk, amelyek szűrik vagy konvertálják a veszélyes stringeket, majd GLOBAL.ASAX-ot használnak vagy kontextuspéldányokat írnak át
Íme egy példa
public static bool SqlFilter2(string InText) 2 { 3 soros word="és|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 hamis; 6 foreach (i string a wordben). Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 igaz visszaad; 11 } 12 } 13 hamis; 14 }
2. Global.asax
protected void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // A Post paraméterek áthaladása, kivéve a rejtett domaineket 4 foreach (string i ebben. Request.Form) 5 { 6 ha(i=="__VIEWSTATE")folytatás; 7 ez.goErr(ez. Request.Form.ToString()); 8 } 9 // Áthaladd a Get paramétert. 10 foreach (I-i szál ebben). Request.QueryString) 11 { 12 ez.goErr(ez. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 ha(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 ez. Response.end() 5 } Előnyök: Ezt a funkciót a legtöbb kezdő programozó használja az SQL befecskendezés megelőzésére, és úgy tűnik, hogy ez a befecskendezés megelőzésére is a legtöbb esetben.
Hátrányok: 1. Szűr néhány karaktert, amelyeket eredetileg nem használtak befecskendezésre, ami váratlan problémákat okoz. Például, ha egy fórumtag neve ugyanazokat a karaktereket tartalmazza, mint a szűrt karakterek, az váratlan problémákat és gondokat okozhat.
2. Minden alkalommal szűrés vagy átalakítás szükséges, ami csökkenti a program hatékonyságát
2. Paraméteres lekérdezésekhez tárolt eljárások használata
Az SQL injekció fő célja, hogy rosszindulatú parancsokat hajtson végre az adatbázisban azáltal, hogy rosszindulatú SQL kódot küld be. Ezért, amíg az SQL parancsokat a végrehajtás előtt feldolgozják, az SQL injekció hatékonyan megelőzhető. A paraméterezett lekérdezések hatékonyan megakadályozhatják az SQL befecskendezését.
Példa
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Paraméterek parms = új Paraméterek("@UserName", DbType.String, userName); Fentebb van egy @UserName paraméter, a Prarmeter objektum használatával, amelyen keresztül a paraméter hozzáadódik a Command objektumhoz, Ez egy paraméterezett lekérdezést ad. Ahogy fentebb leírták, ADO.NET a következő SQL utasítást küldi az SQL Servernek:
Exec sp_executesql N 'válassz * a [pe_users] helyről, ahol username=@username ',N '@username nvarchar(20) ',@username=N 'név' Az SQL Server a lekérdezés végrehajtása előtt a "name" sorra cseréli @username. Tegyük fel, hogy a következő bemenetek vannak:
'Union select @@version,null,null— A generált SQL utasítás így néz ki:
Exec sp_executesql N 'válassz * a [pe_users] helyről, ahol username=@username ',N '@username nvarchar(20) ',@username=N ''' unió select @@version,null,null--' Láthatod, hogy ADO.NET kikerüli a bemenetet.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kód másolása
A DbTye vagy SqlDbType különböző adattípusok lehetnek. Az adattípusod alapján választhatsz. Bizonyos helyeken a paraméter hosszának meghatározására is használható: int size. Ez hatékonyan megakadályozza az adatbázis túlcsordulását és SQL jegyzeteit is Lehetőség a belépésre. Előnyök: Hatékonyan megakadályozza az SQL befecskendezést. Hátrányok: Egyes helyeken nem alkalmazhatók, például
3. Fehérlista
Leírás: Néhány ismert paramétertartomány kezelhető fehérlisták formájában, amelyek megakadályozhatják az SQL befecskendezését és lekérdezését Hibás például: sorrend + oszlopnév szerint, amikor az oszlop nevét paraméter formájában továbbítják, egy fehérlistát lehet megfogalmazni, hogy először megítélje a paramétert hogy a szám benne van-e a fehérlistán, majd lekérdezés, különben rosszul lesz feldolgozva. Előnyök: biztonságos és megbízható Hátrányok: Kis alkalmazási kör |