Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 16201|Atsakyti: 0

[ASP.NET] Anti-SQL injekcijos ASP.NET

[Kopijuoti nuorodą]
Paskelbta 2015-04-17 13:06:50 | | |

1. Kas yra SQL injekcija?
     Vadinamoji SQL injekcija yra įterpti SQL komandas į formos formą, kad būtų galima pateikti arba įvesti domeno vardo ar puslapio užklausos eilutę, ir galiausiai apgauti serverį, kad jis vykdytų kai kurias kenkėjiškas SQL komandas. Pateikdami parametrus, kad sukurtumėte protingus SQL teiginius, galite sėkmingai gauti norimus duomenis.

2. SQL injekcijos tipas
Tiksliau, SQL injekciją galima suskirstyti į penkias kategorijas, būtent: skaičių injekcija, simbolių injekcija, paieškos injekcija (kaip), injekcija ir sakinio ryšio injekcija.
Taikymo požiūriu ypatingas dėmesys turėtų būti skiriamas SQL injekcijai į IP, paieškai, paketiniam ištrynimui ir perkėlimui iš duomenų bazės į duomenų bazę.

3. Kaip švirkšti

Pažvelkime į tipišką pavyzdį
SqlCommand cmd = naujas SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
2+ Vartotojo vardas + "' IR Vartotojo Slaptažodis = '" + Slaptažodis + "'", conn);

Kadangi nėra UserName ir PassWord patvirtinimo, jei UserName="admin' OR 1=1--"
Įvykdytas SQL sakinys tampa:

PASIRINKITE * IŠ PE_USERS KUR UserName='admin' OR 1=1—' AND UserPassword=''

Tai lemia SQL injekciją, o sąlygos visada yra teisingos, todėl galite sėkmingai prisijungti be slaptažodžio.



4. Kaip išvengti SQL injekcijos

1. Filtruokite arba konvertuokite įtartinas eilutes

      SQL injekcija užkertama kelio rašant funkcijas, kurios filtruoja arba konvertuoja pavojingas eilutes, o tada naudoja GLOBAL.ASAX arba perrašo konteksto egzempliorius

     Štai pavyzdys

viešas statinis bool SqlFilter2 (eilutė InText)
2  {
3 eilutė word="ir|exec|įterpti|pasirinkti|ištrinti|atnaujinti|chr|mid|master|arba|sutrumpinti|char|deklaruoti|prisijungti";
4 if(InText==null)
5 grąžinti klaidingą;
6 foreach(eilutė i žodyje. Split('|'))
7   {
8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1))
9    {
10 grįžti teisinga;
11    }
12   }
13 atsakyti klaidingas;
14  }


2. Global.asax

apsaugota void Application_BeginRequest(Objekto siuntėjas, EventArgs e)
2  {
3 // Įrašo parametrų perėjimas, išskyrus paslėptus domenus
4 foreach(eilutė i šiame. Request.Form)
5   {
6 if(i=="__VIEWSTATE")tęsti;
7 this.goErr(šis. Request.Form.ToString());   
8   }
9 // Pereikite parametrą Get.
10 foreach(eilutė i. Request.QueryString)
11   {
12 this.goErr(šis. Request.QueryString.ToString());   
13   }
14  }
privatus void goErr(eilutė tm)
2  {
3 if(WLCW. Extend.CValidity.SqlFilter2(tm))
4 tai. Atsakymas.pabaiga()
5  }

Argumentai "už": Šį aspektą naudoja dauguma pradedančiųjų programuotojų, kad išvengtų SQL injekcijos, ir atrodo, kad daugeliu atvejų jis gerai veikia, kad būtų išvengta injekcijos.

Trūkumai: 1. Jis filtruos kai kuriuos simbolius, kurie iš pradžių nebuvo naudojami injekcijai, sukeldamas netikėtų problemų. Pavyzdžiui, jei forumo nario varde yra tie patys simboliai kaip ir filtruotuose simboliuose, tai sukels netikėtų problemų ir rūpesčių.

        2. Kiekvieną kartą reikia filtruoti arba konvertuoti, o tai sumažina programos efektyvumą

2. Naudokite saugomas procedūras parametrinėms užklausoms

Pagrindinis SQL injekcijos tikslas yra vykdyti kenkėjiškas komandas duomenų bazėje pateikiant kenkėjišką SQL kodą. Todėl, kol SQL komandos apdorojamos prieš vykdant, SQL injekcijai galima veiksmingai užkirsti kelią. Parametrizuotos užklausos gali veiksmingai užkirsti kelią SQL injekcijai.

Pavyzdys

const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName";
Parametrai parms = new Parameters("@UserName", DbType.String, userName);

Yra aukščiau @UserName parametras, naudojant objektą "Prarmeter", per kurį parametras pridedamas prie "Command" objekto,
Taip gausite parametrizuotą užklausą.
Kaip aprašyta aukščiau, ADO.NET siunčia šį SQL sakinį į SQL serverį:

Exec sp_executesql N 'pasirinkite * iš [pe_users], kur username=@username ',N
'@username nvarchar(20) ',@username=N 'vardas'

SQL serveris pakeičia @username eilute "pavadinimas" prieš vykdydamas užklausą.
Tarkime, kad turite šiuos įėjimus:

'Union Select @@version,null,null—

Sugeneruotas SQL sakinys atrodo taip:

Exec sp_executesql N 'pasirinkite * iš [pe_users], kur username=@username ',N
'@username nvarchar(20) ',@username=N ''' sąjunga pasirinkti @@version,null,null--'

Matote, kad ADO.NET išvengia įvesties.

  1. public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopijuoti kodą


DbTye arba SqlDbType gali būti įvairių tipų duomenų.
Galite pasirinkti pagal savo duomenų tipą.
Kai kuriose vietose jis taip pat gali būti naudojamas parametro ilgiui nurodyti: int dydis. Tai taip pat veiksmingai apsaugo nuo duomenų bazės perpildymo ir SQL pastabų
Galimybė įeiti.
Argumentai "už": Veiksmingai apsaugo nuo SQL injekcijos.
Trūkumai: Kai kurių vietų negalima pritaikyti, pavyzdžiui.

3. Baltasis sąrašas

apibūdinimas:
Kai kuriuos žinomus parametrų diapazonus galima tvarkyti baltųjų sąrašų pavidalu, o tai gali užkirsti kelią SQL injekcijai ir užklausoms
Neteisinga, pavyzdžiui: tvarka pagal + stulpelio pavadinimą, kai stulpelio pavadinimas perduodamas parametro pavidalu, pirmiausia galima suformuluoti baltąjį sąrašą, kad pirmiausia būtų galima įvertinti parametrą
ar numeris yra baltajame sąraše, tada užklauskite, kitaip jis bus apdorotas neteisingai.
Privalumai: saugus ir patikimas
Trūkumai: Mažas pritaikymo spektras




Ankstesnis:Teksto laukelyje galima įvesti tik skaičius
Kitą:asp.net teksto rengyklė (FCKeditor)
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com