1. Was ist SQL-Injektion? Die sogenannte SQL-Injektion besteht darin, SQL-Befehle ins Formular einzufügen, um die Abfragefolge des Domainnamens oder der Seitenanfrage einzureichen oder einzugeben und schließlich den Server dazu zu bringen, bösartige SQL-Befehle auszuführen. Indem Sie Parameter einreichen, um clevere SQL-Anweisungen zu erstellen, können Sie erfolgreich die gewünschten Daten erhalten.
2. SQL Art der Injektion Konkret lässt sich SQL-Injection in fünf Kategorien unterteilen, nämlich: Number Injection, Character Injection, Search Injection (wie), In-Injection und Sentence Connection Injection. Aus Anwendungssicht sollte besondere Aufmerksamkeit auf SQL-Injektion in IP, Suche, Batch-Löschung und Übertragung von Datenbank zu Datenbank gelegt werden.
3. Wie man injiziert
Schauen wir uns ein typisches Beispiel an
SqlCommand cmd = neuer SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ BenutzerName + "' UND BenutzerPasswort = '" + PassWord + "'", Kommando); Da es keine Validierung für BenutzerName und PassWord gibt, wenn Benutzername="admin' ODER 1=1--" Die ausgeführte SQL-Anweisung wird:
WÄHLE * AUS PE_USERS WO Benutzername='admin' ODER 1=1—' UND BenutzerPasswort='' Das führt zu einer SQL-Injektion, und die Bedingungen gelten immer, sodass man sich erfolgreich ohne Passwort anmelden kann.
4. Wie man SQL-Injection verhindert
1. Verdächtige Strings filtern oder konvertieren
SQL-Injection wird verhindert, indem Funktionen geschrieben werden, die gefährliche Zeichenketten filtern oder umwandeln, und dann GLOBAL.ASAX verwenden oder Kontextinstanzen neu schreiben
Hier ein Beispiel
öffentlicher statischer Bool SqlFilter2(String InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 Rückkehr falsch; 6 foreach(String i in Word. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 kehren wahr zurück; 11 } 12 } 13 Rückkehr falsch; 14 }
2. Global.asax
protected void Application_BeginRequest(Objektsender, EventArgs e) 2 { 3 // Durchquerung der Post-Parameter, außer bei versteckten Domänen 4 foreach(string i in diesem Bereich. Anfrage.Form) 5 { 6 if(i=="__VIEWSTATE")fortsetzen; 7 this.goErr(this. Request.Form.ToString()); 8 } 9 // Durchqueren des Get-Parameters. 10 für jede (Zeichenkette i in diesem Bereich. Request.QueryString) 11 { 12 this.goErr(this. Request.QueryString.ToString()); 13 } 14 } private Void goErr(String tm) 2 { 3 if (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 das. Response.end() 5 } Vorteile: Dieser Aspekt wird von den meisten Anfängern genutzt, um SQL-Injection zu verhindern, und scheint in den meisten Fällen gut zu funktionieren, um Injektionen zu verhindern.
Nachteile: 1. Es filtert einige Zeichen, die ursprünglich nicht für die Injektion verwendet wurden, was unerwartete Probleme verursacht. Wenn zum Beispiel der Name eines Forenmitglieds dieselben Zeichen wie die gefilterten Zeichen enthält, führt das zu unerwarteten Problemen und Schwierigkeiten.
2. Jedes Mal ist eine Filterung oder Konvertierung erforderlich, was die Effizienz des Programms verringert
2. Verwendung gespeicherter Prozeduren für parametrische Abfragen
Der Hauptzweck der SQL-Injection ist es, bösartige Befehle in der Datenbank auszuführen, indem bösartiger SQL-Code eingereicht wird. Daher kann SQL-Injektion effektiv verhindert werden, solange SQL-Befehle vor der Ausführung verarbeitet werden. Parametrisierte Abfragen können SQL-Injection effektiv verhindern.
Beispiel
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parameter parms = neue Parameter("@UserName", DbType.String, userName); Es gibt einen oben @UserName Parameter, der das Prarmeter-Objekt verwendet, durch den der Parameter zum Command-Objekt hinzugefügt wird, Das liefert eine parametrisierte Abfrage. Wie oben beschrieben, sendet ADO.NET folgende SQL-Anweisung an SQL Server:
Exec sp_executesql N 'select * aus [pe_users], wo Benutzername=@username ',N '@username nvarchar(20) ',@username=N 'name' SQL Server ersetzt @username durch den String "name", bevor die Abfrage ausgeführt wird. Angenommen, Sie haben folgende Eingaben:
'Union select @@version, null, null— Die generierte SQL-Anweisung sieht so aus:
Exec sp_executesql N 'select * aus [pe_users], wo Benutzername=@username ',N '@username nvarchar(20) ',@username=N '''' Vereinigung wählen @@version,null,null--' Man sieht, dass ADO.NET dem Input entgeht.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Code kopieren
DbTye oder SqlDbType können verschiedene Datentypen sein. Du kannst basierend auf deinem Datentyp wählen. An manchen Stellen kann es auch verwendet werden, um die Länge des Parameters anzugeben: int-Größe. Dies verhindert auch effektiv Datenbanküberläufe und SQL-Notizen Möglichkeit des Eintritts. Vorteile: Verhindert effektiv SQL-Injection. Nachteile: Manche Orte können nicht angewendet werden, wie zum Beispiel in.
3. Whitelist
Beschreibung: Einige bekannte Parameterbereiche können in Form von Whitelists behandelt werden, was SQL-Injektionen und Abfragen verhindert Falsch, zum Beispiel: Ordnung nach + Spaltennamen, wenn der Spaltenname in Form eines Parameters übergeben wird, kann eine Whitelist formuliert werden, um den Parameter zuerst zu beurteilen ob die Nummer in der Whitelist ist und dann abfragen, sonst wird sie falsch verarbeitet. Vorteile: sicher und zuverlässig Nachteile: Kleiner Anwendungsbereich |