1. Hva er SQL-injeksjon? Den såkalte SQL-injeksjonen går ut på å sette inn SQL-kommandoer i skjemaet for å sende inn eller legge inn spørringsstrengen til domenenavnet eller sideforespørselen, og til slutt lure serveren til å utføre noen ondsinnede SQL-kommandoer. Ved å sende inn parametere for å konstruere smarte SQL-setninger, kan du med suksess oppnå ønsket data.
2. SQL type injeksjon Spesifikt kan SQL-injeksjon deles inn i fem kategorier, nemlig: tallinjeksjon, tegninjeksjon, søkeinjeksjon (som), in-injeksjon, og setningsinjeksjon. Fra et applikasjonsperspektiv bør det vies spesiell oppmerksomhet til SQL-injeksjon i IP, søk, batch-sletting og overføring fra database til database.
3. Hvordan injisere
La oss se på et typisk eksempel
SqlCommand cmd = ny SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ brukernavn + "' OG brukerpassord = '" + passord + "'", konn); Siden det ikke finnes validering for Brukernavn og PassWord, hvis Brukernavn="admin' ELLER 1=1--" Den utførte SQL-setningen blir:
VELG * FRA PE_USERS HVOR Brukernavn='admin' ELLER 1=1—' OG BrukerPassord='' Dette resulterer i SQL-injeksjon, og betingelsene er alltid sanne, så du kan logge inn uten passord.
4. Hvordan forhindre SQL-injeksjon
1. Filtrer eller konverter mistenkelige strenger
SQL-injeksjon forhindres ved å skrive funksjoner som filtrerer eller konverterer farlige strenger, og deretter bruker GLOBAL.ASAX eller omskriver kontekstinstanser
Her er et eksempel
offentlig statisk bool SqlFilter2(streng InText) 2 { 3 streng word="og|exec|sett inn|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 retur falsk; 6 foreach(streng i i Word. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 returnerer sann; 11 } 12 } 13 returner falsk; 14 }
2. Global.asax
beskyttet void Application_BeginRequest(Objektavsender, EventArgs e) 2 { 3 // Traversering av postparametrene, bortsett fra skjulte domener 4 foreach(streng i i denne. Request.Form) 5 { 6 hvis(i=="__VIEWSTATE")fortsett; 7 this.goErr(this. Request.Form.ToString()); 8 } 9 // Traversere Get-parameteren. 10 foreach(streng i i denne. Request.QueryString) 11 { 12 this.goErr(this. Request.QueryString.ToString()); 13 } 14 } privat tomrom goErr(streng tm) 2 { 3 hvis (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 dette. Response.end() 5 } Fordeler: Dette aspektet brukes av de fleste nybegynnere for å forhindre SQL-injeksjon, og det ser ut til å fungere godt for å forhindre injeksjon i de fleste tilfeller.
Ulemper: 1. Den vil filtrere noen tegn som opprinnelig ikke ble brukt til injeksjon, noe som forårsaker uventede problemer. For eksempel, hvis et forummedlems navn inneholder de samme tegnene som de filtrerte tegnene, vil det føre til noen uventede problemer og problemer.
2. Filtrering eller konvertering er nødvendig hver gang, noe som reduserer programmets effektivitet
2. Bruk lagrede prosedyrer for parametriske spørringer
Hovedformålet med SQL-injeksjon er å utføre ondsinnede kommandoer i databasen ved å sende inn ondsinnet SQL-kode. Derfor, så lenge SQL-kommandoer behandles før utførelse, kan SQL-injeksjon effektivt forhindres. Parameteriserte spørringer kan effektivt forhindre SQL-injeksjon.
Eksempel
const streng strSql = "VELG * FRA [PE_Users] HVOR Brukernavn = @UserName"; Parametere parms = nye parametere ("@UserName", DbType.String, brukernavn); Det finnes en parameter @UserName ovenfor, ved bruk av Pranger-objektet, gjennom hvilken parameteren legges til Command-objektet, Dette gir deg en parameterisert spørring. Som beskrevet ovenfor sender ADO.NET følgende SQL-setning til SQL Server:
Exec sp_executesql N 'velg * fra [pe_users] hvor brukernavn=@username ',N '@username nvarchar(20) ',@username=N 'navn' SQL Server erstatter @username med strengen "navn" før spørringen kjøres. Anta at du har følgende input:
'Union select @@version, null, null— Den genererte SQL-setningen ser slik ut:
Exec sp_executesql N 'velg * fra [pe_users] hvor brukernavn=@username ',N '@username nvarchar(20) ',@username=N '''' union select @@version,null,null--' Du kan se at ADO.NET unngår inputen.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopier koden
DbTye eller SqlDbType kan være en rekke ulike datatyper. Du kan velge basert på datatypen din. På noen steder kan det også brukes til å spesifisere lengden på parameteren: int-størrelse. Dette forhindrer også effektivt databaseoverløp og SQL-notater Mulighet for å komme inn. Fordeler: Forhindrer effektivt SQL-injeksjon. Ulemper: Noen steder kan ikke brukes, som for eksempel i.
3. Hviteliste
Beskrivelse: Noen kjente parameterområder kan håndteres i form av hvitelister, noe som kan forhindre SQL-injeksjon og spørringer Feil, for eksempel: sorter etter + kolonnenavn, når kolonnenavnet sendes i form av en parameter, kan en hviteliste formuleres for å vurdere parameteren først om nummeret er i hvitelisten, og deretter søker, ellers vil det bli behandlet feil. Fordeler: trygt og pålitelig Ulemper: Lite bruksområde |