Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 16201|Odpověď: 0

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

[Kopírovat odkaz]
Zveřejněno 17.04.2015 13:06:50 | | |

1. Co je SQL injection?
     Takzvaná SQL injekce spočívá v vložení SQL příkazů do formuláře, aby se odeslal nebo zadal dotazovací řetězec doménového jména nebo požadavku na stránku, a nakonec oklamal server, aby spustil škodlivé SQL příkazy. Zadáním parametrů pro vytvoření chytrých SQL příkazů můžete úspěšně získat požadovaná data.

2. SQL typ injekce
Konkrétně lze SQL injekci rozdělit do pěti kategorií, a to: injekce čísel, injekce znaků, injekce vyhledávání (like), in injection a injekce větných spojů.
Z pohledu aplikace je třeba věnovat zvláštní pozornost SQL injekci do IP, vyhledávání, dávkovému mazání a přenosu z databáze do databáze.

3. Jak aplikovat injekci

Podívejme se na typický příklad
SqlCommand cmd = nový SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
2+ UserName + "' A UserPassword = '" + Heslo + "'", conn);

Protože neexistuje ověření pro UserName a Password, pokud UserName="admin" NEBO 1=1--"
Vykonáný SQL příkaz se stává:

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

To vede k SQL injection a podmínky jsou vždy splněné, takže se můžete úspěšně přihlásit i bez hesla.



4. Jak zabránit injekci SQL

1. Filtrovat nebo převádět podezřelé řetězce

      SQL injection je zabráněno psaním funkcí, které filtrují nebo převádějí nebezpečné řetězce, a poté používají GLOBAL.ASAX nebo přepisují kontextové instance

     Tady je pří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 (nepravdivé);
6 předeř (řetězec i ve slově. Split('|'))
7   {
8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1))
9    {
10 vrácených true;
11    }
12   }
13 return false (nepravdivé);
14  }


2. Global.asax

chráněný void Application_BeginRequest(Object sender, EventArgs e)
2  {
3 // Procházení parametrů příspěvku, kromě skrytých domén
4 předeřáze (struna I v tomto. Žádost.Formulář)
5   {
6 if(i=="__VIEWSTATE")pokračuje;
7 toto.goErr(tohle. Request.Form.ToString());   
8   }
9 // Projděte parametr Get.
10 předeřáz (String I v tomto. Request.QueryString)
11   {
12 toto.gErr(tohle. Request.QueryString.ToString());   
13   }
14  }
private void goErr(string tm)
2  {
3 if(WLCW. Extend.CValidity.SqlFilter2(tm))
4 tohle. Response.end()
5  }

Výhody: Tento aspekt používá většina začínajících programátorů k zabránění SQL injectionu a zdá se, že ve většině případů dobře funguje k prevenci injection.

Nevýhody: 1. Filtruje některé znaky, které původně nebyly použity pro injekci, což způsobí neočekávané problémy. Například pokud jméno člena fóra obsahuje stejné znaky jako filtrované znaky, může to způsobit nečekané problémy a potíže.

        2. Filtrování nebo konverze je vyžadováno pokaždé, což snižuje efektivitu programu

2. Použití uložených procedur pro parametrické dotazy

Hlavním účelem SQL injection je provádět škodlivé příkazy v databázi odesíláním škodlivého SQL kódu. Proto lze SQL injekci, pokud jsou SQL příkazy zpracovány před vykonáním, účinně zabránit. Parametrizované dotazy mohou účinně zabránit injekci SQL.

Příklad

const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName";
Parametry parms = nové parametry ("@UserName", DbType.String, uživatelské jméno);

Existuje parametr @UserName výše, pomocí objektu Prarmeter, kterým je parametr přidán k objektu příkazu,
To vám dá parametrizovaný dotaz.
Jak bylo popsáno výše, ADO.NET odesílá SQL Serveru následující SQL příkaz:

Exec sp_executesql N 'vyberte * z [pe_users], kde uživatelské jméno=@username ',N
'@username nvarchar(20) ',@username=N 'jméno'

SQL Server nahrazuje @username řetězcem "jméno" před vykonáním dotazu.
Předpokládejme, že máte následující vstupy:

'union select @@version,null,null—

Generovaný SQL příkaz vypadá takto:

Exec sp_executesql N 'vyberte * z [pe_users], kde uživatelské jméno=@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írovat kód


DbTye nebo SqlDbType mohou být různé datové typy.
Můžete si vybrat podle typu dat.
Na některých místech lze také použít k určení délky parametru: velikost int. To také účinně zabraňuje přetečení databáze a SQL poznámkám
Možnost vstupu.
Výhody: Účinně zabraňuje SQL injection.
Nevýhody: Některá místa nelze aplikovat, například v.

3. Whitelist

Popis:
Některé známé rozsahy parametrů lze zpracovávat ve formě whitelistů, což může zabránit injekci SQL a dotazování
Špatně, například: seřaďte podle + jména sloupce, když je název sloupce předán ve formě parametru, lze formulovat whitelist, který parametr nejprve posoudí
zda je číslo v bílé listině, a pak dotazovat, jinak bude zpracováno nesprávně.
Výhody: bezpečné a spolehlivé
Nevýhody: Malý rozsah aplikací




Předchozí:Textové pole umožňuje zadávání pouze čísel
Další:asp.net Textový editor (FCKeditor)
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com