|
|
Opslået på 17/04/2015 13.06.50
|
|
|

1. Hvad er SQL-injektion? Den såkaldte SQL-injektion er at indsætte SQL-kommandoer i formularformularen for at indsende eller indtaste forespørgselsstrengen for domænenavnet eller sideanmodningen, og til sidst narre serveren til at udføre nogle ondsindede SQL-kommandoer. Ved at indsende parametre for at konstruere smarte SQL-sætninger kan du med succes opnå de ønskede data.
2. SQL type injektion Specifikt kan SQL-injektion opdeles i fem kategorier, nemlig: talinjektion, tegninjektion, søgeinjektion (ligesom), in-injektion og sætningsforbindelsesinjektion. Set fra et applikationsmæssigt synspunkt bør der gives særlig opmærksomhed til SQL-injektion i IP, søgning, batch-sletning og overførsel fra database til database.
3. Hvordan man injicerer
Lad os se på et typisk eksempel
SqlCommand cmd = ny SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ Brugernavn + "' OG brugerAdgangskode = '" + PassWord + "'", conn); Da der ikke er validering for Brugernavn og Passord, hvis Brugernavn="admin' ELLER 1=1--" Den udførte SQL-sætning bliver:
VÆLG * FRA PE_USERS HVOR BrugerNavn='admin' ELLER 1=1—' OG BrugerAdgangskode='' Dette resulterer i SQL-injektion, og betingelserne er altid opfyldt, så du kan logge ind uden adgangskode.
4. Hvordan man forhindrer SQL-injektion
1. Filtrer eller konverter mistænkelige strenge
SQL-injektion forhindres ved at skrive funktioner, der filtrerer eller konverterer farlige strenge, og derefter bruger GLOBAL.ASAX eller omskriver kontekstinstanser
Her er et eksempel
offentlig statisk bool SqlFilter2(streng InText) 2 { 3 streng word="og|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 returnerer falsk; 6 foreach(streng i i Word. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 vender sandt; 11 } 12 } 13 retur falsk; 14 }
2. Global.asax
beskyttet void Application_BeginRequest(Objektafsender, EventArgs e) 2 { 3 // Gennemgang af postparametrene, undtagen for skjulte domæner 4 foreach(streng i i denne. Anmodning.Form) 5 { 6 if(i=="__VIEWSTATE")fortsætter; 7 this.goErr(this. Request.Form.ToString()); 8 } 9 // Traverser Get-parameteren. 10 foreach(streng i i denne. Request.QueryString) 11 { 12 this.goErr(this. Request.QueryString.ToString()); 13 } 14 } privat tomrum goErr(streng tm) 2 { 3 hvis (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 dette. Response.end() 5 } Fordele: Denne funktion bruges af de fleste begynderprogrammører til at forhindre SQL-injektion, og det ser ud til at fungere godt til at forhindre injektion i de fleste tilfælde.
Ulemper: 1. Den filtrerer nogle tegn, der oprindeligt ikke blev brugt til injektion, hvilket skaber uventede problemer. For eksempel, hvis et forummedlems navn indeholder de samme tegn som de filtrerede tegn, vil det forårsage nogle uventede problemer og udfordringer.
2. Filtrering eller konvertering er nødvendig hver gang, hvilket reducerer programmets effektivitet
2. Brug lagrede procedurer til parametriske forespørgsler
Hovedformålet med SQL-injektion er at udføre ondsindede kommandoer i databasen ved at indsende ondsindet SQL-kode. Derfor kan SQL-injektion effektivt forhindres, så længe SQL-kommandoer behandles før eksekvering. Parameteriserede forespørgsler kan effektivt forhindre SQL-injektion.
Eksempel
const streng strSql = "VÆLG * FRA [PE_Users] HVOR Brugernavn = @UserName"; Parametre parms = nye Parametre ("@UserName", DbType.String, brugernavn); Der er en parameter @UserName ovenfor, ved brug af Pranger-objektet, hvorigennem parameteren tilføjes til Command-objektet, Dette giver dig en parameteriseret forespørgsel. Som beskrevet ovenfor sender ADO.NET følgende SQL-sætning til SQL Server:
Exec sp_executesql N 'vælg * fra [pe_users] hvor brugernavn=@username ',N '@username nvarchar(20) ',@username=N 'navn' SQL Server erstatter @username med strengen "navn", før forespørgslen udføres. Antag, at du har følgende input:
'Union select @@version, null, null— Den genererede SQL-sætning ser sådan ud:
Exec sp_executesql N 'vælg * fra [pe_users] hvor brugernavn=@username ',N '@username nvarchar(20) ',@username=N '''' union select @@version,null,null--' Du kan se, at ADO.NET undslipper inputtet.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopier kode
DbTye eller SqlDbType kan være forskellige datatyper. Du kan vælge ud fra din datatype. Nogle steder kan den også bruges til at angive længden af parameteren: int-størrelse. Dette forhindrer også effektivt databaseoverløb og SQL-noter Mulighed for at komme ind. Fordele: Forhindrer effektivt SQL-injektion. Ulemper: Nogle steder kan ikke anvendes, såsom i.
3. Whitelist
Beskrivelse: Nogle kendte parameterområder kan håndteres i form af whitelister, som kan forhindre SQL-injektion og forespørgsler Forkert, for eksempel: orden efter + kolonnenavn, når kolonnenavnet gives i form af en parameter, kan en whitelist formuleres for først at vurdere parameteren om nummeret er på whitelisten, og derefter forespørgsel, ellers vil det blive behandlet forkert. Fordele: sikker og pålidelig Ulemper: Lille udvalg af anvendelser |
Tidligere:Tekstboksen tillader kun, at tal indtastesNæste:asp.net Teksteditor (FCKeditor)
|