1. Kas ir SQL injekcija? Tā sauktā SQL injekcija ir ievietot SQL komandas veidlapas veidlapā, lai iesniegtu vai ievadītu domēna nosaukuma vai lapas pieprasījuma vaicājuma virkni, un visbeidzot apmānīt serveri, lai izpildītu dažas ļaunprātīgas SQL komandas. Iesniedzot parametrus, lai izveidotu gudrus SQL paziņojumus, jūs varat veiksmīgi iegūt vēlamos datus.
2. SQL injekcijas veids Konkrēti, SQL injekciju var iedalīt piecās kategorijās, proti: skaitļu injekcija, rakstzīmju injekcija, meklēšanas injekcija (piemēram), injekcija un teikuma savienojuma injekcija. No lietojumprogrammas viedokļa īpaša uzmanība jāpievērš SQL injekcijai IP, meklēšanai, partijas dzēšanai un pārsūtīšanai no datu bāzes uz datu bāzi.
3. Kā injicēt
Apskatīsim tipisku piemēru
SqlCommand cmd = jauns SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ Lietotājvārds + "' UN Lietotāja parole = '" + Ieejas vārds + "'", conn); Tā kā UserName un PassWord nav validācijas, ja UserName="admin' OR 1=1--" Izpildītais SQL paziņojums kļūst:
ATLASIET * NO PE_USERS KUR UserName='admin' OR 1=1—' AND UserPassword='' Tas izraisa SQL injekciju, un nosacījumi vienmēr ir patiesi, lai jūs varētu veiksmīgi pieteikties bez paroles.
4. Kā novērst SQL injekciju
1. Aizdomīgu virkņu filtrēšana vai konvertēšana
SQL injekciju novērš, rakstot funkcijas, kas filtrē vai konvertē bīstamas virknes, un pēc tam izmanto GLOBAL.ASAX vai pārraksta konteksta instances
Lūk, piemērs
publiskais statiskais bool SqlFilter2(virkne InText) 2 { 3 virknes word="un|exec|ievietot|atlasīt|dzēst|atjaunināt|chr|mid|master|vai|saīsināt|char|paziņot|pievienoties"; 4 if(InText==null) 5 atgriešanās nepatiesa; 6 foreach(virkne i vārdā. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 atgriežas true; 11 } 12 } 13 atgriešanās nepatiesa; 14 }
2. Globālais.asax
aizsargāts tukšums Application_BeginRequest(Objekta sūtītājs, EventArgs e) 2 { 3 // Ziņas parametru šķērsošana, izņemot slēptos domēnus 4 foreach(virkne i šajā. Pieprasījums.Veidlapa) 5 { 6 if(i=="__VIEWSTATE")turpināt; 7 this.goErr(šis. Request.Form.ToString()); 8 } 9 // Šķērsojiet parametru Iegūt. 10 foreach(virkne i šajā. Request.QueryString) 11 { 12 this.goErr(šis. Request.QueryString.ToString()); 13 } 14 } private void goErr(virkne tm) 2 { 3 ja (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 šis. Atbilde.beigas () 5 } Plusi: Šo aspektu izmanto lielākā daļa iesācēju programmētāju, lai novērstu SQL injekciju, un šķiet, ka tas darbojas labi, lai vairumā gadījumu novērstu injekciju.
Trūkumi: 1. Tas filtrēs dažas rakstzīmes, kas sākotnēji netika izmantotas injekcijām, radot negaidītas problēmas. Piemēram, ja foruma dalībnieka vārds satur tādas pašas rakstzīmes kā filtrētās rakstzīmes, tas radīs dažas negaidītas problēmas un nepatikšanas.
2. Katru reizi ir nepieciešama filtrēšana vai konvertēšana, kas samazina programmas efektivitāti
2. Saglabāto procedūru izmantošana parametriskajiem vaicājumiem
SQL injekcijas galvenais mērķis ir izpildīt ļaunprātīgas komandas datu bāzē, iesniedzot ļaunprātīgu SQL kodu. Tāpēc, kamēr SQL komandas tiek apstrādātas pirms izpildes, SQL injekciju var efektīvi novērst. Parametrizēti vaicājumi var efektīvi novērst SQL injekciju.
Piemērs
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parametri parms = new Parameters("@UserName", DbType.String, userName); Iepriekš @UserName parametrs, izmantojot objektu Prarmeter, caur kuru parametrs tiek pievienots komandas objektam, Tādējādi tiek parādīts parametrizēts vaicājums. Kā aprakstīts iepriekš, ADO.NET nosūta šādu SQL paziņojumu SQL serverim:
Exec sp_executesql N 'atlasiet * no [pe_users], kur lietotājvārds=@username ',N '@username nvarchar(20) ',@username=N 'nosaukums' SQL Server aizstāj @username ar virkni "nosaukums" pirms vaicājuma izpildes. Pieņemsim, ka jums ir šādas ievades:
'savienība atlasīt @@version,null,null— Ģenerētais SQL paziņojums izskatās šādi:
Exec sp_executesql N 'atlasiet * no [pe_users], kur lietotājvārds=@username ',N '@username nvarchar(20) ',@username=N ''' savienība select @@version,null,null--' Jūs varat redzēt, ka ADO.NET izvairās no ievades.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopēt kodu
DbTye vai SqlDbType var būt dažādi datu tipi. Varat izvēlēties, pamatojoties uz datu tipu. Dažās vietās to var izmantot arī, lai norādītu parametra garumu: int izmērs. Tas arī efektīvi novērš datu bāzes pārpildi un SQL piezīmes Ieejas iespēja. Plusi: Efektīvi novērš SQL injekciju. Trūkumi: Dažas vietas nevar piemērot, piemēram.
3. Baltais saraksts
Apraksts: Dažus zināmus parametru diapazonus var apstrādāt balto sarakstu veidā, kas var novērst SQL injekciju un vaicāšanu Nepareizi, piemēram: pasūtījums pēc + kolonnas nosaukums, kad kolonnas nosaukums tiek nodots parametra formā, var formulēt balto sarakstu, lai vispirms spriestu par parametru vai numurs ir baltajā sarakstā, un pēc tam vaicājiet, pretējā gadījumā tas tiks apstrādāts nepareizi. Priekšrocības: drošs un uzticams Trūkumi: Neliels pielietojumu klāsts |