1. Mikä on SQL-injektio? Niin kutsuttu SQL-injektio tarkoittaa SQL-komentojen lisäämistä lomakelomakkeeseen, jotta verkkotunnuksen tai sivupyynnön kyselymerkkijono voidaan lähettää tai syöttää, ja lopuksi huijata palvelin suorittamaan haitallisia SQL-komentoja. Lähettämällä parametreja älykkäiden SQL-lauseiden rakentamiseen voit onnistuneesti saada halutun datan.
2. SQL pistostyyppi Tarkemmin sanottuna SQL-injektio voidaan jakaa viiteen kategoriaan, nimittäin: lukujen injektio, merkkien injektio, hakuinjektio (like), injektio ja lauseyhteyden injektio. Sovelluksen näkökulmasta erityistä huomiota tulisi kiinnittää SQL-injektioon IP-osoitteeseen, hakuun, eräpoistoon ja siirtoon tietokannasta toiseen.
3. Kuinka pistettä tehdään
Katsotaanpa tyypillistä esimerkkiä
SqlCommand cmd = uusi SqlCommand ("VALITSE * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + PassWord + "'", conn); Koska UserNamelle ja PassWordille ei ole validointia, jos UserName="admin' TAI 1=1--" Suoritettu SQL-lause muuttuu:
VALITSE * FROM PE_USERS MISSÄ UserName='admin' OR 1=1—' AND UserPassword='' Tämä johtaa SQL-injektioon, ja ehdot ovat aina paikkansapitäviä, joten voit kirjautua onnistuneesti ilman salasanaa.
4. Kuinka estää SQL-injektio
1. Suodata tai muunna epäilyttävät merkkijonot
SQL-injektio estetään kirjoittamalla funktioita, jotka suodattavat tai muuntavat vaarallisia merkkijonoja, ja käyttävät GLOBAL.ASAX-tiedostoa tai uudelleenkirjoitetaan kontekstiinstansseja
Tässä esimerkki
public static bool SqlFilter2(string InText) 2 { 3 merkkijono word="ja|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|joine"; 4 if(InText==null) 5 vastaa väärin; 6 foreach (string i sanassa. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 palautuu todeksi; 11 } 12 } 13 vastaa väärin; 14 }
2. Global.asax
suojattu void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Post-parametrien läpikäyminen, paitsi piilotetut domainit 4 foreach (string i tähän. Request.Form) 5 { 6 if(i=="__VIEWSTATE")jatkuu; 7 tätä.goErr(tämä. Request.Form.ToString()); 8 } 9 // Kulje Get-parametrin läpi. 10 foreach (string i tähän). Request.QueryString) 11 { 12 tätä.goErr(tätä. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 jos (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 tätä. Response.end() 5 } Plussat: Tätä ominaisuutta käyttävät useimmat aloittelijaohjelmoijat estääkseen SQL-injektion, ja se näyttää toimivan hyvin useimmissa tapauksissa.
Haitat: 1. Se suodattaa joitakin merkkejä, joita ei alun perin käytetty injektioon, mikä aiheuttaa odottamattomia ongelmia. Esimerkiksi, jos foorumin jäsenen nimi sisältää samat merkit kuin suodatetut merkit, se voi aiheuttaa odottamattomia ongelmia ja ongelmia.
2. Suodatus tai muunnos vaaditaan joka kerta, mikä heikentää ohjelman tehokkuutta
2. Käytä tallennettuja proseduuria parametrisiin kyselyihin
SQL-injektion päätarkoitus on suorittaa haitallisia komentoja tietokannassa lähettämällä haitallista SQL-koodia. Siksi, kunhan SQL-komennot käsitellään ennen suoritusta, SQL-injektio voidaan tehokkaasti estää. Parametrisoidut kyselyt voivat tehokkaasti estää SQL:n injektion.
Esimerkki
const string strSql = "VALITSE * FROM [PE_Users] MISSÄ UserName = @UserName"; Parametrit parms = uudet parametrit ("@UserName", DbType.String, userName); Yllä @UserName parametri, jossa käytetään Prarmeter-objektia, jonka kautta parametri lisätään Command-objektiin, Tämä antaa parametrisoidun kyselyn. Kuten yllä kuvattiin, ADO.NET lähettää seuraavan SQL-lauseen SQL Serverille:
Exec sp_executesql N 'valitse * joukosta [pe_users], missä käyttäjänimi=@username ',N '@username nvarchar(20) ',@username=N 'nimi' SQL Server korvaa @username merkkijonolla "name" ennen kyselyn suorittamista. Oletetaan, että sinulla on seuraavat syötteet:
'liitto valitsee @@version,null,null— Generoitu SQL-lause näyttää tältä:
Exec sp_executesql N 'valitse * joukosta [pe_users], missä käyttäjänimi=@username ',N '@username nvarchar(20) ',@username=N ''' yhdiste valitse @@version,null,null--' Näet, että ADO.NET pakenee syötteestä.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopioi koodi
DbTye tai SqlDbType voi olla monenlaisia tietotyyppejä. Voit valita tietotyyppisi perusteella. Joissain paikoissa sitä voidaan käyttää myös parametrin pituuden määrittämiseen: int-koko. Tämä estää myös tehokkaasti tietokannan ylivuodot ja SQL-muistiinpanot Mahdollisuus mennä sisään. Plussat: Estää tehokkaasti SQL:n injektion. Haitat: Joitakin paikkoja ei voi soveltaa, kuten sisään.
3. Valkoinen lista
Kuvaus: Joitakin tunnettuja parametrialueita voidaan käsitellä valkoisten listojen muodossa, jotka voivat estää SQL-injektion ja kyselyt Väärin, esimerkiksi: järjestys + sarakkeen nimi, kun sarakkeen nimi välitetään parametrin muodossa, voidaan muodostaa valkoinen lista, joka arvioi parametrin ensin Onko numero valkolistalla, ja sitten kysy, muuten se käsitellään väärin. Edut: turvallinen ja luotettava Haitat: Pieni käyttökohteiden valikoima |