Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 16201|Odpoveď: 0

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

[Kopírovať odkaz]
Zverejnené 17. 4. 2015 13:06:50 | | |

1. Čo je SQL injection?
     Takzvaná SQL injekcia spočíva v vložení SQL príkazov do formulára na odoslanie alebo zadanie dotazovacieho reťazca požiadavky na doménové meno alebo stránku, a nakoniec oklamanie servera, aby vykonal škodlivé SQL príkazy. Zadaním parametrov na vytvorenie šikovných SQL príkazov môžete úspešne získať požadované dáta.

2. SQL typ injekcie
Konkrétne možno SQL injection rozdeliť do piatich kategórií, a to: číselná injekcia, znaková injekcia, vyhľadávacia injekcia (like), in injection a sentence connection injection.
Z pohľadu aplikácie by sa mala venovať osobitná pozornosť SQL injekcii do IP, vyhľadávaniu, dávkovému mazaniu a prenosu z databázy do databázy.

3. Ako aplikovať injekciu

Pozrime sa na typický príklad
SqlCommand cmd = nový SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
2+ UserName + "' AND UserPassword = '" + PassWord + "'", conn);

Keďže neexistuje overenie pre UserName a Password, ak UserName="admin" ALEBO 1=1--"
Vykonaný SQL príkaz sa stáva:

VYBERTE * Z PE_USERS KDE UserName='admin' ALEBO 1=1—' A UserPassword=''

To vedie k SQL injekcii a podmienky sú vždy splnené, takže sa môžete úspešne prihlásiť aj bez hesla.



4. Ako zabrániť SQL injekcii

1. Filtrovať alebo konvertovať podozrivé reťazce

      SQL injection sa zabraňuje písaním funkcií, ktoré filtrujú alebo konvertujú nebezpečné reťazce, a potom používajú GLOBAL.ASAX alebo prepisujú kontextové inštancie

     Tu je príklad

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 Preach (reťazec I vo Worde. Split('|'))
7   {
8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1))
9    {
10 návratov true;
11    }
12   }
13 return false (falošné);
14  }


2. Global.asax

chránený void Application_BeginRequest(Object sender, EventArgs e)
2  {
3 // Prechádzanie parametrov príspevku, okrem skrytých domén
4 predmluva (String I v tomto. Žiadosť. Formulár)
5   {
6 if(i=="__VIEWSTATE")pokračovať;
7 this.goErr(this. Request.Form.ToString());   
8   }
9 // Prejdite parameter Dostať.
10 preach(String I v tomto. Request.QueryString)
11   {
12 this.goErr(this. Request.QueryString.ToString());   
13   }
14  }
private void goErr(string tm)
2  {
3 if(WLCW. Extend.CValidity.SqlFilter2(tm))
4 toto. Response.end()
5  }

Výhody: Tento aspekt používa väčšina začiatočníkov na zabránenie SQL injection a zdá sa, že vo väčšine prípadov dobre funguje na zabránenie injectionu.

Nevýhody: 1. Filtruje niektoré znaky, ktoré pôvodne neboli použité na injekciu, čo spôsobuje nečakané problémy. Napríklad, ak meno člena fóra obsahuje rovnaké znaky ako filtrované znaky, spôsobí to nečakané problémy a ťažkosti.

        2. Filtrovanie alebo konverzia je potrebná zakaždým, čo znižuje efektivitu programu

2. Použitie uložených procedúr pre parametrické dotazy

Hlavným účelom SQL injection je vykonávať škodlivé príkazy v databáze odoslaním škodlivého SQL kódu. Preto, pokiaľ sú SQL príkazy spracované pred vykonaním, SQL injection je možné efektívne zabrániť. Parametrizované dotazy môžu účinne zabrániť injekcii SQL.

Príklad

const string strSql = "SELECT * FROM [PE_Users] KDE UserName = @UserName";
Parameters parms = nové parametre ("@UserName", DbType.String, userName);

Existuje parameter @UserName vyššie, pomocou objektu Prarmeter, cez ktorý sa parameter pridáva k objektu príkazu,
To vám dá parametrizovaný dotaz.
Ako bolo popísané vyššie, ADO.NET posiela SQL Serveru nasledujúci SQL príkaz:

Exec sp_executesql N 'vyber * z [pe_users], kde používateľské meno=@username ',N
'@username nvarchar(20) ',@username=N 'meno'

SQL Server nahradí @username reťazcom "name" pred vykonaním dotazu.
Predpokladajme, že máte nasledujúce vstupy:

'union select @@version,null,null—

Generovaný SQL príkaz vyzerá takto:

Exec sp_executesql N 'vyber * z [pe_users], kde používateľské meno=@username ',N
'@username nvarchar(20) ',@username=N ''' union select @@version,null,null--'

Vidíte, že ADO.NET uniká vstupu.

  1. public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopírovať kód


DbTye alebo SqlDbType môžu byť rôzne typy dát.
Môžete si vybrať podľa typu údajov.
Na niektorých miestach sa dá použiť aj na určenie dĺžky parametra: int size. To tiež účinne zabraňuje pretečeniu databázy a SQL poznámkam
Možnosť vstúpiť.
Výhody: Efektívne zabraňuje SQL injection.
Nevýhody: Niektoré miesta sa nedajú aplikovať, napríklad v.

3. Whitelist

Popis:
Niektoré známe rozsahy parametrov je možné spracovať vo forme bielych zoznamov, ktoré môžu zabrániť SQL injekcii a dotazom
Nesprávne, napríklad: zoradite podľa + názvu stĺpca, keď sa názov stĺpca odovzdá vo forme parametra, môže sa najskôr zostaviť whitelist na posúdenie parametra
či je číslo v bielom zozname, a potom dotaz, inak bude spracované nesprávne.
Výhody: bezpečné a spoľahlivé
Nevýhody: Malý rozsah aplikácií




Predchádzajúci:Textové pole umožňuje zadávať iba čísla
Budúci:asp.net Textový editor (FCKeditor)
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com