Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 16201|Svar: 0

[ASP.NET] ASP.NET af Anti-SQL-injektion

[Kopier link]
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.

  1. 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 indtastes
Næste:asp.net Teksteditor (FCKeditor)
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com