Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 16201|Odgovoriti: 0

[ASP.NET] ASP.NET anti-SQL injekcije

[Kopiraj povezavo]
Objavljeno na 17. 04. 2015 13:06:50 | | |

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.

  1. 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




Prejšnji:Besedilno polje dovoljuje le vnos številk
Naslednji:asp.net Urejevalnik besedila (FCKeditor)
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com