1. Wat is SQL-injectie? De zogenaamde SQL-injectie is het invoeren van SQL-commando's in het formulierformulier om de querystring van de domeinnaam of het pageverzoek in te dienen of in te voeren, en uiteindelijk de server te misleiden om kwaadaardige SQL-commando's uit te voeren. Door parameters in te dienen om slimme SQL-statements te construeren, kun je succesvol de gewenste data verkrijgen.
2. SQL type injectie Specifiek kan SQL-injectie worden onderverdeeld in vijf categorieën, namelijk: getalleninjectie, tekeninjectie, zoekinjectie (zoals), in-injectie en zinsverbindingsinjectie. Vanuit applicatieperspectief moet speciale aandacht worden besteed aan SQL-injectie in IP, zoeken, batchverwijdering en overdracht van database naar database.
3. Hoe injecteren
Laten we naar een typisch voorbeeld kijken
SqlCommand cmd = nieuwe SqlCommand ("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' EN UserPassword = '" + PassWord + "'", conn); Aangezien er geen validatie is voor UserName en PassWord, als UserName="admin' OF 1=1--" De uitgevoerde SQL-instructie wordt:
SELECTEER * UIT PE_USERS WAAR UserName='admin' OF 1=1—' EN UserPassword='' Dit resulteert in SQL-injectie, en de voorwaarden zijn altijd waar, dus je kunt succesvol inloggen zonder wachtwoord.
4. Hoe SQL-injectie te voorkomen
1. Filteren of converteren verdachte strings
SQL-injectie wordt voorkomen door functies te schrijven die gevaarlijke strings filteren of converteren, en vervolgens GLOBAL.ASAX te gebruiken of contextinstanties te herschrijven
Hier is een voorbeeld
publieke statische bool SqlFilter2(string InText) 2 { 3 string word="en|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 return false; 6 foreach(string i in word. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 keer waar; 11 } 12 } 13 retourneren vals; 14 }
2. Global.asax
beschermde void Application_BeginRequest(Objectzender, EventArgs e) 2 { 3 // Door de Postparameters lopen, behalve voor verborgen domeinen 4 voor each(string i in dit. Request.Form) 5 { 6 als(i=="__VIEWSTATE")ga door; 7 dit.goErr(dit. Request.Form.ToString()); 8 } 9 // doorloop de Get-parameter. 10 voor elke (string i in dit. Request.QueryString) 11 { 12 dit.goErr(dit. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 als (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 dit. Response.end() 5 } Voordelen: Dit aspect wordt door de meeste beginnende programmeurs gebruikt om SQL-injectie te voorkomen, en het lijkt in de meeste gevallen goed te werken om injectie te voorkomen.
Nadelen: 1. Het filtert sommige tekens die oorspronkelijk niet voor injectie werden gebruikt, wat onverwachte problemen veroorzaakt. Als bijvoorbeeld de naam van een forumlid dezelfde tekens bevat als de gefilterde tekens, veroorzaakt dat onverwachte problemen en problemen.
2. Filtering of conversie is elke keer nodig, wat de efficiëntie van het programma vermindert
2. Gebruik opgeslagen procedures voor parametrische queries
Het hoofddoel van SQL-injectie is het uitvoeren van kwaadaardige commando's in de database door kwaadaardige SQL-code in te dienen. Daarom kan, zolang SQL-commando's vóór uitvoering worden verwerkt, SQL-injectie effectief worden voorkomen. Geparametriseerde queries kunnen SQL-injectie effectief voorkomen.
Voorbeeld
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parameters parms = nieuwe Parameters("@UserName", DbType.String, userName); Er is een parameter @UserName hierboven, met behulp van het Pranger-object, waardoor de parameter aan het Command-object wordt toegevoegd, Dit geeft je een geparametriseerde query. Zoals hierboven beschreven, stuurt ADO.NET de volgende SQL-instructie naar SQL Server:
Exec sp_executesql N 'selecteer * uit [pe_users] waar gebruikersnaam=@username ',N '@username nvarchar(20) ',@username=N 'naam' SQL Server vervangt @username door de string "name" voordat de query wordt uitgevoerd. Stel dat je de volgende invoer hebt:
'Union select @@version, null, null— De gegenereerde SQL-instructie ziet er als volgt uit:
Exec sp_executesql N 'selecteer * uit [pe_users] waar gebruikersnaam=@username ',N '@username nvarchar(20) ',@username=N ''' unie selecteren @@version,null,null--' Je ziet dat ADO.NET de input ontglipt.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Code kopiëren
DbTye of SqlDbType kunnen verschillende soorten data zijn. Je kunt kiezen op basis van je datatype. Op sommige plaatsen kan het ook worden gebruikt om de lengte van de parameter: int-grootte te specificeren. Dit voorkomt ook effectief databaseoverflows en SQL-notities Mogelijkheid om binnen te komen. Voordelen: Voorkomt effectief SQL-injectie. Nadelen: Sommige plekken kunnen niet worden toegepast, zoals in.
3. Whitelist
Beschrijving: Sommige bekende parameterbereiken kunnen worden behandeld in de vorm van whitelists, wat SQL-injectie en query's kan voorkomen Fout, bijvoorbeeld: volgorde op + kolomnaam, wanneer de kolomnaam wordt doorgegeven in de vorm van een parameter, kan een whitelist worden geformuleerd om de parameter eerst te beoordelen of het nummer in de whitelist staat, en dan een zoekopdracht indient, anders wordt het verkeerd verwerkt. Voordelen: veilig en betrouwbaar Nadelen: Klein scala aan toepassingen |