1. Mis on SQL-i süstimine? Nn SQL-süstmine tähendab SQL-käskude sisestamist vormivormi, et esitada või sisestada domeeninime või lehe päringu string ning lõpuks petta server käivitama pahatahtlikke SQL-käske. Parameetrite esitamisega nutikate SQL-lausete koostamiseks saad edukalt soovitud andmed.
2. SQL süstitüüp Täpsemalt saab SQL-süstimise jagada viide kategooriasse: numbrisüstimine, tähemärgisüstimine, otsingusüstimine (like), sissesüstimine ja lauseseose süstimine. Rakenduse seisukohast tuleks erilist tähelepanu pöörata SQL-i süstimisele IP-s, otsingule, partiikustutamisele ja andmebaasist andmebaasi ülekandmisele.
3. Kuidas süstida
Vaatame tüüpilist näidet
SqlCommand cmd = uus SqlCommand ("SELECT * FROM PE_USERS KUS Kasutajanimi = '" 2+ UserName + "' AND UserPassword = '" + PassWord + "'", conn); Kuna UserName ja PassWordi valideerimist ei ole, siis kui UserName="admin' OR 1=1--" Käivitatud SQL-lause on järgmine:
VALI * PE_USERS KUS UserName='admin' VÕI 1=1—' JA UserPassword='' See viib SQL-i süstimiseni ja tingimused kehtivad alati, nii et saad edukalt sisse logida ilma paroolita.
4. Kuidas vältida SQL-i süstimist
1. Filtreeri või teisenda kahtlaseid stringe
SQL-süstimist takistatakse, kui kirjutatakse funktsioone, mis filtreerivad või teisendavad ohtlikke stringe ning seejärel kasutavad GLOBAL.ASAX-i või kirjutavad konteksti instantse ümber
Siin on näide
public static bool SqlFilter2(string InText) 2 { 3 string word="ja|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|joine"; 4 if(InText==null) 5 tagastab vale; 6 foreach (string i sõnas. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 tagastab tõe; 11 } 12 } 13 on vale; 14 }
2. Global.asax
kaitstud void Application_BeginRequest(Objekti saatja, EventArgs e) 2 { 3 // Posti parameetrite läbiviimine, välja arvatud peidetud domeenid 4 foreach (string i siin. Request.Form) 5 { 6 if(i=="__VIEWSTATE")jätkub; 7 see.goErr(see. Request.Form.ToString()); 8 } 9 // Läbige Get parameeter. 10 foreach (string i siin. Request.QueryString) 11 { 12 seda.goErr(see. Request.QueryString.ToString()); 13 } 14 } privaatne void goErr (string tm) 2 { 3 kui(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 seda. Response.end() 5 } Plussid: Seda aspekti kasutavad enamik algajaid programmeerijatest SQL-i süstimise vältimiseks ja tundub, et see töötab enamikul juhtudel hästi süstimise vältimiseks.
Puudused: 1. See filtreerib mõningaid märke, mida algselt süstimiseks ei kasutatud, põhjustades ootamatuid probleeme. Näiteks, kui foorumiliikme nimi sisaldab samu märke nagu filtreeritud tähed, võib see põhjustada ootamatuid probleeme ja probleeme.
2. Iga kord on vaja filtreerida või teisendada, mis vähendab programmi efektiivsust
2. Kasuta salvestatud protseduure parameetriliste päringute jaoks
SQL süstimise peamine eesmärk on käivitada pahatahtlikke käske andmebaasis, esitades pahatahtlikku SQL-koodi. Seega, kui SQL-käsud töödeldakse enne täitmist, saab SQL-süstimist tõhusalt vältida. Parametriseeritud päringud võivad tõhusalt takistada SQL-i süstimist.
Näide
const string strSql = "SELECT * FROM [PE_Users] KUS UserName = @UserName"; Parameetrid parms = uued parameetrid("@UserName", DbType.String, userName); Ülaltoodud parameeter @UserName, kasutades Prarmeteri objekti, mille kaudu parameeter lisatakse Command objektile, See annab sulle parameetristatud päringu. Nagu eespool kirjeldatud, saadab ADO.NET SQL Serverile järgmise SQL-lause:
Exec sp_executesql N 'vali * [pe_users] juurest, kus kasutajanimi=@username ',N '@username nvarchar(20) ',@username=N 'nimi' SQL Server asendab @username stringiga "name" enne päringu käivitamist. Oletame, et sul on järgmised sisendid:
'Ametiühing vali @@version,null,null— Genereeritud SQL-lause näeb välja selline:
Exec sp_executesql N 'vali * [pe_users] juurest, kus kasutajanimi=@username ',N '@username nvarchar(20) ',@username=N ''' liit select @@version,null,null--' Näete, et ADO.NET pääseb sisendist välja.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopeeri kood
DbTye või SqlDbType võib olla mitmesuguseid andmetüüpe. Sa saad valida vastavalt oma andmetüübile. Mõnes kohas saab seda kasutada ka parameetri pikkuse määramiseks: int suurus. See takistab tõhusalt ka andmebaasi ületäitumist ja SQL-märkmeid Võimalus siseneda. Plussid: Tõhusalt takistab SQL-i süstimist. Puudused: Mõnda kohta ei saa rakendada, näiteks
3. Valgenimekiri
Kirjeldus: Mõningaid tuntud parameetrite vahemikke saab hallata valgete nimekirjade kujul, mis võivad takistada SQL-i süstimist ja päringuid Vale, näiteks: järjestus + veeru nime järgi, kui veeru nimi edastatakse parameetri kujul, saab koostada valge nimekirja, mis hindab parameetrit esimesena kas number on valges nimekirjas, ja siis päringu, vastasel juhul töödeldakse seda valesti. Eelised: ohutu ja usaldusväärne Puudused: Rakenduste valik on väike |