1. Einführung in die SQL-Injection
SQL-Injection ist eine der häufigsten Netzwerkangriffsmethoden. Sie nutzt nicht den Fehler des Betriebssystems, sondern Ziele Programmierer Nachlässigkeit beim Programmieren ermöglichte die Anmeldung ohne Konto über SQL-Anweisungen und manipulierte sogar die Datenbank.
Die allgemeine Idee des SQL-Injection-Angriffs
1. Bestimmen Sie den Servertyp und Hintergrunddatenbanktyp
3. Führen Sie SQL-Injection-Angriffe basierend auf verschiedenen Server- und Datenbankeigenschaften durch
3. Beispiele für SQL-Injection-AngriffeZum Beispiel auf eine Anmeldeschnittstelle, die die Eingabe von Benutzername und Passwort erfordert:
Sie können es wie folgt eingeben, um sich ohne Konto anzumelden:
Benutzername: 'oder 1 = 1 –
Passwort :
Klicken Sie hier, um sich anzumelden. Wenn keine Sonderbehandlung erfolgt, meldet sich der illegale Benutzer sehr stolz an (Natürlich haben sich einige Sprachdatenbanken
APIbereits mit diesen Problemen befasst.) Warum ist das so? Lassen Sie es uns unten analysieren:
Theoretisch wird es die folgende SQL-Anweisung im Hintergrundauthentifizierungsprogramm geben:
Wenn der oben genannte Benutzername und Passwort eingegeben werden, wird die obige SQL-Anweisung zu Erfolg:String sql = "select * from user_table where username= ' "+userName+" ' and password=' "+password+" '";
SELECT * FROM user_table WHERE username= '’or 1 = 1 -- and password='’
Nach der Bedingung Benutzername=“oder 1=1 Benutzername ist gleich“ oder 1= 1, dann wird diese Bedingung definitiv erfolgreich sein;
Dann fügen Sie am Ende zwei hinzu, was bedeutet, dass
Annotationdie folgenden Anweisungen mit Anmerkungen versehen wird, um sie unwirksam zu machen immer korrekt ausgeführt werden, und der Benutzer kann das System leicht täuschen und sich eine legale Identität verschaffen. Wenn es relativ sanft durchgeführt wird
... die Folgen kann man sich vorstellen...SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''
Lassen Sie mich über die Gegenmaßnahmen für JSP sprechen:
1. (Einfache und effektive Methode) PreparedStatementverwendet einen vorkompilierten Anweisungssatz, der Es verfügt über eine integrierte Fähigkeit zur Verarbeitung von SQL-Injection. Verwenden Sie einfach die Methode setXXX, um den Wert zu übergeben.
Vorteile der Verwendung:
(1). Lesbarkeit und Wartbarkeit des Codes.
(2).PreparedStatement verbessert die Leistung so weit wie möglich.
( 3) Der wichtigste Punkt ist, dass es die
SicherheitSQL-Injection wirkt sich nur auf den Vorbereitungs- (Kompilierungs-) Prozess von SQL-Anweisungen aus eine destruktive Wirkung
und das PreparedStatement ist bereits vorbereitet. Die Ausführungsphase verarbeitet nur die Eingabezeichenfolge als Daten,
und analysiert und bereitet die SQL-Anweisung nicht mehr vor, wodurch eine SQL-Injection vermieden wird.
2. Verwenden Sieregulären Ausdruck, um die eingehenden Parameter zu filtern Zu importierendes Paket:
import java.util.regex.*;
正则表达式:
private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;
判断是否匹配:
Pattern.matches(CHECKSQL,targerStr);
下面是具体的正则表达式:
检测SQL meta-characters的正则表达式 :
/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix
修正检测SQL meta-characters的正则表达式 :
/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i
典型的SQL 注入攻击的正则表达式 :
/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
检测SQL注入,UNION查询关键字的正则表达式
:/((\%27)|(\’))union/ix(\%27)|(\’)
检测MS SQL Server SQL注入攻击的正则表达式:
/exec(\s|\+)+(s|x)p\w+/ix
等等…..
3.字符串过滤
比较通用的一个方法:
(||之间的参数可以根据自己程序的需要添加)
public static boolean sql_inj(String str){ String inj_str = "'|and|exec|insert|select|delete|update| count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; String inj_stra[] = split(inj_str,"|"); for (int i=0 ; i < inj_stra.length ; i++ ){ if (str.indexOf(inj_stra[i])>=0){ return true; } } return false; }
4.jsp中调用该函数检查是否包函非法字符
防止SQL从URL注入:
sql_inj.java代码:
package sql_inj; import java.net.*; import java.io.*; import java.sql.*; import java.text.*; import java.lang.String; public class sql_inj{ public static boolean sql_inj(String str){ String inj_str = "'|and|exec|insert|select|delete|update| count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
//这里的东西还可以自己添加
String[] inj_stra=inj_str.split("\\|"); for (int i=0 ; i < inj_stra.length ; i++ ){ if (str.indexOf(inj_stra[i])>=0){ return true; } } return false; } }
5.JSP页面判断代码:
使用javascript在客户端进行不安全字符屏蔽
功能介绍:检查是否含有”‘”,”\\”,”/”
参数说明:要检查的字符串
返回值:0:是1:不是
函数名是
function check(a){ return 1; fibdn = new Array (”‘” ,”\\”,”/”); i=fibdn.length; j=a.length; for (ii=0; ii<i; ii++) { for (jj=0; jj<j; jj++) { temp1=a.charAt(jj); temp2=fibdn[ii]; if (tem’; p1==temp2) { return 0; } } } return 1; }
===================================
总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。
凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。
【相关推荐】
1. 特别推荐:“php程序员工具箱”V0.1版本下载
Das obige ist der detaillierte Inhalt vonWie kann man SQL-Injection verhindern? Wir stellen 5 Möglichkeiten vor, SQL-Injection zu verhindern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!