1. Kaj je SQL injekcija? Tako imenovana SQL injekcija je vstavljanje SQL ukazov v obrazec za oddajo ali vnos poizvedbenega niza zahteve po imenu domene ali strani ter na koncu prevarati strežnik, da izvede zlonamerne SQL ukaze. Z oddajo parametrov za sestavo pametnih SQL stavkov lahko uspešno pridobite želene podatke.
2. SQL vrsta injekcije Natančneje, SQL injekcijo lahko razdelimo v pet kategorij, in sicer: vbrizgavanje številk, vstavljanje znakov, iskalno vbrizgavanje (všečkov), in vbrizgavanje in vnos stavčnih povezav. Z vidika aplikacije je treba posebno pozornost nameniti SQL vbrizgavanju v IP, iskanju, serijskemu brisanju in prenosu iz baze v bazo.
3. Kako injicirati
Poglejmo tipičen primer
SqlCommand cmd = novi SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + PasswordWord + "'", conn); Ker ni potrditve za UserName in Password, če je UserName="admin' ALI 1=1--" Izvedeni SQL ukaz postane:
IZBERI * IZ PE_USERS KJER UserName='admin' ALI 1=1—' IN UserPassword='' To povzroči SQL injekcijo, pogoji pa so vedno resnični, tako da se lahko uspešno prijavite brez gesla.
4. Kako preprečiti SQL injekcijo
1. Filtrirajte ali pretvorite sumljive nize
SQL injekcije preprečujemo z pisanjem funkcij, ki filtrirajo ali pretvorijo nevarne nize, nato pa uporabijo GLOBAL.ASAX ali prepišejo kontekstne primerke
Tukaj je primer
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 foreach (niz I v Wordu. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 vrnitve pravilno; 11 } 12 } 13 se vrne napačno; 14 }
2. Global.asax
zaščiten void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Prečkanje parametrov objave, razen skritih domen 4 Predgovor (String I v tem. Request.Form) 5 { 6 if(i=="__VIEWSTATE")nadaljuj; 7 to.goErr (to. Request.Form.ToString()); 8 } 9 // Preišči parameter Get. 10 foreach (String I v tem. Request.QueryString) 11 { 12 to.goErr (to. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 if(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 to. Response.end() 5 } Prednosti: Ta vidik uporablja večina začetnikov programerjev za preprečevanje SQL injekcije in se zdi, da v večini primerov dobro deluje za preprečevanje injekcije.
Slabosti: 1. Filtrira nekatere znake, ki prvotno niso bili uporabljeni za injekcijo, kar povzroča nepričakovane težave. Na primer, če ime člana foruma vsebuje iste znake kot filtrirani znaki, bo to povzročilo nepričakovane težave in težave.
2. Vsakič je potrebna filtracija ali pretvorba, kar zmanjša učinkovitost programa
2. Uporaba shranjenih postopkov za parametrične poizvedbe
Glavni namen SQL injekcije je izvajanje zlonamernih ukazov v podatkovni bazi z oddajo zlonamerne SQL kode. Zato je mogoče SQL injekcijo, dokler se SQL ukazi obdelajo pred izvajanjem, učinkovito preprečiti. Parametrizirane poizvedbe lahko učinkovito preprečijo SQL injekcijo.
Primer
const string strSql = "SELECT * FROM [PE_Users] WHERE Username = @UserName"; Parameters parms = novi parametri ("@UserName", DbType.String, uporabniško ime); Obstaja parameter @UserName zgoraj, z uporabo objekta Prarmeter, preko katerega se parameter doda objektu ukaza, To vam da parametrizirano poizvedbo. Kot je opisano zgoraj, ADO.NET SQL Serverju pošlje naslednjo SQL izjavo:
Exec sp_executesql N 'izberi * iz [pe_users], kjer je uporabniško ime=@username ',N '@username nvarchar(20) ',@username=N 'ime' SQL Server @username zamenja z nizom "ime" pred izvajanjem poizvedbe. Predpostavimo, da imate naslednje vhode:
'unija izbere @@version,null,null— Generirana SQL izjava izgleda takole:
Exec sp_executesql N 'izberi * iz [pe_users], kjer je uporabniško ime=@username ',N '@username nvarchar(20) ',@username=N ''' unija izbere @@version,null,null--' Lahko vidiš, da ADO.NET uide vhodu.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopiraj kodo
DbTye ali SqlDbType sta lahko različni podatkovni tipi. Lahko izbirate glede na svoj tip podatkov. Na nekaterih mestih se lahko uporabi tudi za določitev dolžine parametra: int size. To prav tako učinkovito preprečuje prelivanje baze podatkov in SQL zapiske Možnost vstopa. Prednosti: Učinkovito preprečuje SQL injekcije. Slabosti: Nekaterih mest ni mogoče uporabiti, na primer v.
3. Bela lista
Opis: Nekatere znane razpone parametrov je mogoče obravnavati v obliki belih seznamov, kar lahko prepreči SQL injekcijo in poizvedovanje Napačno, na primer: uvrstimo po + imenu stolpca, ko se ime stolpca prenese v obliki parametra, se lahko oblikuje bela lista, ki najprej oceni parameter ali je številka na belem seznamu, nato poizvedite, sicer bo postopek napačno obdelan. Prednosti: varno in zanesljivo Slabosti: Majhen nabor aplikacij |