Der SQL -Injektionsangriff bezieht sich auf die Nutzung von Design -Schwachstellen, die Ausführung von SQL -Befehlen auf Zielservern und andere Angriffe.
Der Hauptgrund, warum der SQL -Injektionsangriff erfolgreich ist, wenn SQL -Befehle dynamisch generiert werden.
Zum Beispiel:
Wenn Ihre Abfrageanweisung aus Select * aus Administrator ist, wobei userername = '"& user &"' und password = '"& pwd &"' "" "
Dann, wenn mein Benutzername lautet: 1 'oder' 1 '=' 1
Dann wird Ihre Abfrageerklärung:
Wählen Sie * aus admin where userername = '1 oder' 1 '=' 1 'und password =' "& pwd &" '""
Auf diese Weise wird Ihre Abfrageanweisung übergeben und Sie können Ihre Verwaltungsschnittstelle eingeben.
Bei der Verhinderung müssen Sie daher die Eingabe des Benutzers überprüfen. Sonderzeichen wie Einzelzitate, Doppelzitate, Semikolons, Kommas, Kolons, Verbindungen usw. werden konvertiert oder gefiltert.
Die Sonderzeichen und Saiten, die gefiltert werden müssen, sind:
Netto -Benutzer
xp_cmdshell
/hinzufügen
EXEC Master.dbo.xp_cmdshell
NET LOCALGROUP -Administratoren
wählen
zählen
ASC
verkohlen
Mitte
''
:
"
einfügen
löschen aus
Tropfentisch
aktualisieren
kürzen
aus
%
Im Folgenden finden Sie zwei Präventionscodes, die ich über die Lösung von Injektionsangriffen für Ihre Lernreferenz geschrieben habe!
JS -Version des SQL Injection Attack Code ~:
[Code Start]
<script Language = "JavaScript">
<!-
var url = location.Search;
var re =/^/? (.*) (SELECT%20 | Einfügen%20 |%20FROM%20 | count/(| Drop%20Table | Update%20TRATE%20 | ASC/(| Mid/(| char/ (| xp_cmdshell | exec%20Master | net%20LocalGroup%20Administrators |/"|: | net%20User |/'|%20OR%20) (.*) $/gi;
var e = re.Test (URL);
if (e) {
alarm ("Die Adresse enthält illegale Zeichen ~");
location.href = "error.asp";
}
//->
<Script>
[Code End]
ASP -Version des Codes, um SQL -Injektionsangriffe zu verhindern ~:
[Code Start]
<%
Bei der nächsten Fehleraufnahme als nächstes
Dim Strtemp
Wenn Lase (Request.Servervariables ("https")) = "Aus" dann
STRTemp = "http: //"
Anders
STRTemp = "https: //"
Ende wenn
STRTemp = Strtemp & Request.Servervariables ("Server_Name")
If request.servervariables ("server_port") <> 80, dann strtemp = strtemp & ":" & request.servervariables ("server_port"))
STRTemp = Strtemp & Request.Servervariables ("URL")
Wenn Trim (Request.QueryString) <> "" dann Strtemp = Strtemp & "?"
STRTEMP = LASCE (STRTEMP)
Wenn instr (STRTemp, "Select%20") oder Instr (STRTemp, "%20") oder Instr (STRTemp, "%20From") oder Instr (STRTemp ", Count (") oder Instr (STRTemp ", Drop, Drop, Drop, Drop, Tropfen" %20Table ") oder Instrument (STRTemp," Update%20 ") oder Instrunden (STRTemp," Truncate%20 ") oder Instrum , "char (") oder instr (strtemp, "xp_cmdshell") oder Instr (strtemp, "exec%20master") oder instr (strtemp, "net%20LocalGroup%20Administrators") oder instr (strtemp ":") oder instr (strtemp, "net%20user") oder instr (strtemp, "" " ") oder instrument (strtemp,"%20or%20 ")
Response.write "<script Language = 'JavaScript'>"
Antwort.Write "Alert ('illegale Adresse !!');
Response.write "location.href = 'error.asp';"
Antwort.Write "<Script>"
Ende wenn
%>
[Code End]
C# Überprüfen Sie Zeichenfolgen, um SQL -Injektionsangriffe zu verhindern
In diesem Beispiel wird es vorläufig als = und 'Zahlen angegeben
bool checkParams (Params -Objekt [] args)
{
String [] lawlesses = {"=", "'"};
if (lawlesses == null || lawlesses.length <= 0) return true;
// regelmäßige Ausdrücke konstruieren, Beispiel: Lawlesses ist das = Zeichen und das 'Zeichen, dann ist der reguläre Ausdruck.* [=}'].* (Für den verwandten Inhalt regulärer Ausdrücke siehe msdn)
// Da ich auch allgemeine und einfach zu änderne Funktionen erledigen möchte, habe ich einen weiteren Schritt von Charakterarray zu regulären Ausdrücken.
String str_regex = ".*[";
für (int i = 0; i <lawlesses.length-1; i ++)
str_regex+= lawlesses [i]+"|";
str_regex+= lawlesses [lawlesses.length-1]+"].*";
//
foreach (Objekt arg in args)
{
Wenn (arg ist String) // Wenn es sich um eine Zeichenfolge handelt, überprüfen Sie direkt
{
if (regex.matches (arg.toString (), str_regex) .count> 0)
false zurückgeben;
}
Ansonsten, wenn (arg ist icollection) // Wenn es sich um eine Sammlung handelt, überprüfen Sie, ob das Element in der Sammlung eine Zeichenfolge ist.
{
foreach (Objekt obj in (iCollection) arg)
{
if (obj ist String)
{
if (regex.matches (obj.toString (), str_regex) .count> 0)
false zurückgeben;
}
}
}
}
zurückkehren;