Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 16201|Svar: 0

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

[Kopiera länk]
Publicerad på 2015-04-17 13:06:50 | | |

1. Vad är SQL-injektion?
     Den så kallade SQL-injektionen innebär att infoga SQL-kommandon i formulärformuläret för att skicka in eller ange frågesträngen för domännamnet eller sidförfrågan, och slutligen lura servern att utföra skadliga SQL-kommandon. Genom att skicka in parametrar för att konstruera smarta SQL-satser kan du framgångsrikt få fram önskad data.

2. SQL typ av injektion
Specifikt kan SQL-injektion delas in i fem kategorier, nämligen: talinjektion, teckeninjektion, sökinjektion (lika), in-injektion och meningskopplingsinjektion.
Ur applikationssynpunkt bör särskild uppmärksamhet ägnas åt SQL-injektion i IP, sökning, batchradering och överföring från databas till databas.

3. Hur man injicerar

Låt oss titta på ett typiskt exempel
SqlCommand cmd = ny SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
2+ Användarnamn + "' OCH användarlösenord = '" + PassWord + "'", kommando);

Eftersom det inte finns någon validering för Användarnamn och PassWord, om Användarnamn="admin' ELLER 1=1--"
Den utförda SQL-satsen blir:

VÄLJ * FRÅN PE_USERS DÄR Användarnamn='admin' ELLER 1=1—' OCH Användarlösenord=''

Detta resulterar i SQL-injektion, och villkoren är alltid uppfyllda, så du kan logga in utan lösenord.



4. Hur man förhindrar SQL-injektion

1. Filtrera eller konvertera misstänkta strängar

      SQL-injektion förhindras genom att skriva funktioner som filtrerar eller konverterar farliga strängar, och sedan använder GLOBAL.ASAX eller skriver om kontextinstanser

     Här är ett exempel

publik statisk bool SqlFilter2(sträng InText)
2  {
3 sträng word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join";
4 if(InText==null)
5 återger falsk;
6 foreach(sträng i i Word. Split('|'))
7   {
8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1))
9    {
10 återvänder sann;
11    }
12   }
13 återkomma falsk;
14  }


2. Global.asax

skyddad void Application_BeginRequest(Objektavsändare, EventArgs e)
2  {
3 // Traversering av postparametrarna, förutom för dolda domäner
4 foreach(sträng i i detta. Begäran.Form)
5   {
6 if(i=="__VIEWSTATE")fortsätter;
7 detta.goErr(detta. Request.Form.ToString());   
8   }
9 // Traversera get-parametern.
10 för varje (sträng i i detta. Request.QueryString)
11   {
12 this.goErr(this. Request.QueryString.ToString());   
13   }
14  }
privat tomrum goErr(sträng tm)
2  {
3 om (WLCW. Extend.CValidity.SqlFilter2(tm))
4 detta. Response.end()
5  }

Fördelar: Denna aspekt används av de flesta nybörjarprogrammerare för att förhindra SQL-injektion, och det verkar fungera bra för att förhindra injektion i de flesta fall.

Nackdelar: 1. Den filtrerar vissa tecken som ursprungligen inte användes för injektion, vilket orsakar oväntade problem. Till exempel, om en forummedlems namn innehåller samma tecken som de filtrerade tecknen, kommer det att orsaka oväntade problem och bekymmer.

        2. Filtrering eller konvertering krävs varje gång, vilket minskar programmets effektivitet

2. Använd lagrade procedurer för parametriska frågor

Huvudsyftet med SQL-injektion är att utföra skadliga kommandon i databasen genom att skicka in skadlig SQL-kod. Därför kan SQL-injektion effektivt förhindras så länge SQL-kommandon bearbetas innan exekvering. Parameteriserade frågor kan effektivt förhindra SQL-injektion.

Exempel

const sträng strSql = "VÄLJ * FRÅN [PE_Users] DÄR Användarnamn = @UserName";
Parametrar parms = nya Parameters("@UserName", DbType.String, userName);

Det finns en parameter @UserName ovan, med Prarmeter-objektet, genom vilken parametern läggs till Command-objektet,
Detta ger dig en parameteriserad fråga.
Som beskrivits ovan skickar ADO.NET följande SQL-sats till SQL Server:

Exec sp_executesql N 'select * från [pe_users] där användarnamn=@username ',N
'@username nvarchar(20) ',@username=N 'namn'

SQL Server ersätter @username med strängen "name" innan frågan exekveras.
Antag att du har följande indata:

'Union select @@version, null, null—

Den genererade SQL-satsen ser ut så här:

Exec sp_executesql N 'select * från [pe_users] där användarnamn=@username ',N
'@username nvarchar(20) ',@username=N '''' union välj @@version,null,null--'

Du kan se att ADO.NET undkommer inmatningen.

  1. public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopiera koden


DbTye eller SqlDbType kan vara olika typer av data.
Du kan välja baserat på din datatyp.
På vissa ställen kan den också användas för att specificera längden på parametern: int-storlek. Detta förhindrar också effektivt databasöverflöden och SQL-anteckningar
Möjlighet att komma in.
Fördelar: Förhindrar effektivt SQL-injektion.
Nackdelar: Vissa platser kan inte tillämpas, som i.

3. Vitlista

Beskrivning:
Vissa kända parameterintervall kan hanteras i form av vitlistor, vilket kan förhindra SQL-injektion och förfrågningar
Fel, till exempel: ordning efter + kolumnnamn, när kolumnnamnet skickas i form av en parameter kan en vitlista formuleras för att först bedöma parametern
om numret finns i vitlistan, och sedan fråga, annars kommer det att behandlas felaktigt.
Fördelar: säker och pålitlig
Nackdelar: Litet användningsområde




Föregående:Textrutan tillåter endast att siffror matas in
Nästa:asp.net Textredigerare (FCKeditor)
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com