Heim  >  Artikel  >  Java  >  Eine ausführliche Einführung zur Vermeidung von SQL-Injection in Java

Eine ausführliche Einführung zur Vermeidung von SQL-Injection in Java

黄舟
黄舟Original
2017-08-22 10:29:291904Durchsuche

Dieser Artikel stellt hauptsächlich vor, wie man SQL-Injection vermeidet. Der Herausgeber findet ihn ziemlich gut. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz. Folgen wir dem Editor und werfen wir einen Blick darauf.

1. Es muss eine strikte Unterscheidung zwischen den Berechtigungen normaler Benutzer und Systemadministratorbenutzern erfolgen.

Wenn ein normaler Benutzer eine andere Drop Table-Anweisung in eine Abfrageanweisung einbettet, darf diese ausgeführt werden, da sich die Drop-Anweisung auf die Basisobjekte der Datenbank bezieht, muss der Benutzer dies tun Betreiben Sie diese Anweisung. Sie müssen über entsprechende Berechtigungen verfügen. Im Berechtigungsentwurf besteht für Endbenutzer, also Benutzer von Anwendungssoftware, keine Notwendigkeit, ihnen Berechtigungen zum Erstellen und Löschen von Datenbankobjekten zu erteilen. Selbst wenn in den von ihnen verwendeten SQL-Anweisungen schädlicher Code eingebettet ist, werden diese Codes aufgrund von Einschränkungen ihrer Benutzerberechtigungen nicht ausgeführt. Daher ist es beim Entwerfen einer Anwendung am besten, Systemadministratorbenutzer von normalen Benutzern zu unterscheiden. Dadurch kann der durch Injektionsangriffe auf die Datenbank verursachte Schaden minimiert werden.

2. Erzwingen Sie die Verwendung parametrisierter Anweisungen.

Wenn die vom Benutzer eingegebenen Variablen beim Schreiben der SQL-Anweisung nicht direkt in die SQL-Anweisung eingebettet werden. Wenn Sie diese Variable über Parameter übergeben, können Sie SQL-Injection-Angriffe wirksam verhindern. Mit anderen Worten: Benutzereingaben dürfen nicht direkt in SQL-Anweisungen eingebettet werden. Im Gegensatz dazu müssen Benutzereingaben gefiltert werden oder es müssen parametrisierte Anweisungen verwendet werden, um Benutzereingabevariablen zu übergeben. Parametrisierte Anweisungen verwenden Parameter, anstatt Benutzereingabevariablen in die SQL-Anweisung einzubetten. Mit dieser Maßnahme können die meisten SQL-Injection-Angriffe verhindert werden. Leider gibt es nicht viele Datenbank-Engines, die parametrisierte Anweisungen unterstützen. Datenbankentwickler sollten jedoch versuchen, bei der Entwicklung von Produkten parametrisierte Anweisungen zu verwenden.

3. Stärken Sie die Überprüfung der Benutzereingaben.

Im Allgemeinen können zwei Methoden verwendet werden, um SQL-Injection-Angriffe zu verhindern. Eine besteht darin, die Überprüfung und Überprüfung von Benutzereingabeinhalten zu verstärken Übergeben Sie Benutzereingabeinhalte. In der SQLServer-Datenbank gibt es viele Tools zur Inhaltsüberprüfung von Benutzereingaben, die Administratoren beim Umgang mit SQL-Injection-Angriffen helfen können. Testen Sie den Inhalt einer String-Variablen und akzeptieren Sie nur den erforderlichen Wert. Lehnen Sie Eingaben ab, die Binärdaten, Escape-Sequenzen und Kommentarzeichen enthalten. Dies trägt dazu bei, Skriptinjektionen zu verhindern und bestimmte Pufferüberlaufangriffe zu verhindern. Testen Sie Benutzereingaben auf Größe und Datentyp und erzwingen Sie entsprechende Grenzwerte und Konvertierungen. Dies trägt dazu bei, absichtliche Pufferüberläufe zu verhindern und hat einen erheblichen Einfluss auf die Verhinderung von Injektionsangriffen.

4. Verwenden Sie die Sicherheitsparameter, die mit der SQL Server-Datenbank geliefert werden.

Um die nachteiligen Auswirkungen von Injektionsangriffen auf die SQL Server-Datenbank zu reduzieren, werden in der SQL Server-Datenbank speziell relativ sichere SQL-Parameter entwickelt. Während des Datenbankentwurfsprozesses sollten Ingenieure versuchen, diese Parameter zu verwenden, um böswillige SQL-Injection-Angriffe zu verhindern.

5. Wie kann man SQL-Injection-Angriffe in mehrschichtigen Umgebungen verhindern?

In mehrschichtigen Anwendungsumgebungen sollten alle von Benutzern eingegebenen Daten überprüft werden nach der Verifizierung Erst dann kann ihnen der Zutritt zum vertrauenswürdigen Bereich gestattet werden. Daten, die den Validierungsprozess nicht bestehen, sollten von der Datenbank abgelehnt und eine Fehlermeldung an die nächste Ebene zurückgegeben werden. Implementieren Sie eine mehrschichtige Verifizierung. Gegen zielstrebige böswillige Benutzer getroffene Vorsichtsmaßnahmen sind gegen entschlossene Angreifer möglicherweise nicht wirksam. Ein besserer Ansatz besteht darin, Eingaben an der Benutzeroberfläche und an allen nachfolgenden Punkten über Vertrauensgrenzen hinweg zu validieren. Beispielsweise kann die Validierung von Daten in der Clientanwendung eine einfache Skriptinjektion verhindern. Wenn die nächste Schicht jedoch denkt, dass ihre Eingabe validiert wurde, kann jeder böswillige Benutzer, der den Client umgehen kann, uneingeschränkten Zugriff auf das System erhalten. Daher müssen in mehrschichtigen Anwendungsumgebungen bei der Verhinderung von Injektionsangriffen alle Schichten zusammenarbeiten und auf der Client- und Datenbankseite entsprechende Maßnahmen ergriffen werden, um Injektionsangriffe mit SQL-Anweisungen zu verhindern.

6. Nutzen Sie bei Bedarf professionelle Schwachstellen-Scanning-Tools, um mögliche Angriffspunkte zu finden.

Der Einsatz professioneller Schwachstellen-Scanning-Tools kann Administratoren dabei helfen, mögliche Punkte für SQL-Injection-Angriffe zu finden. Allerdings können Schwachstellen-Scan-Tools nur Angriffspunkte erkennen und sich nicht aktiv gegen SQL-Injection-Angriffe verteidigen. Natürlich wird dieses Tool häufig von Angreifern verwendet. Angreifer können mit diesem Tool beispielsweise automatisiert nach Angriffszielen suchen und Angriffe durchführen. Aus diesem Grund sollten Unternehmen bei Bedarf in einige professionelle Tools zum Scannen von Schwachstellen investieren. Ein vollständiger Schwachstellenscanner unterscheidet sich von einem Netzwerkscanner dadurch, dass er gezielt nach SQL-Injection-Schwachstellen in der Datenbank sucht. Die neuesten Schwachstellenscanner suchen nach den zuletzt entdeckten Schwachstellen. Daher können professionelle Tools Administratoren dabei helfen, SQL-Injection-Schwachstellen zu entdecken und Administratoren daran zu erinnern, aktive Maßnahmen zur Verhinderung von SQL-Injection-Angriffen zu ergreifen. Wenn der Datenbankadministrator die SQL-Injection-Schwachstellen entdeckt, die der Angreifer finden kann, und aktive Maßnahmen ergreift, um die Schwachstellen zu blockieren, hat der Angreifer keine Möglichkeit, damit anzufangen.

上面主要是介绍了在web应用程序中对sql注入的大体解决思路,下面我们就根据java web应用程序的特征来具体说明一下如何解决在java web应用程序中的sql注入问题。

1.采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.


String sql= "select * from users where username=? and password=?; 
     PreparedStatement preState = conn.prepareStatement(sql); 
     preState.setString(1, userName); 
     preState.setString(2, password); 
     ResultSet rs = preState.executeQuery();

原理:sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

正则表达式:


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

等等…..

其实可以简单的使用replace方法也可以实现上诉功能:


 public static String TransactSQLInjection(String str)
     {
        return str.replaceAll(".*([';]+|(--)+).*", " ");
     }

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_stralength ; 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 = "&#39;|and|exec|insert|select|delete|update| 
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; 
//这里的东西还可以自己添加 
String[] inj_stra=inj_strsplit("\\|"); 
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&#39;; p1==temp2) 
{ return 0; } 
} 
} 
return 1; 
}

 关于安全性,本文可总结出一下几点:

1.要对用户输入的内容保持警惕。

2.只在客户端进行输入验证等于没有验证。

3.永远不要把服务器错误信息暴露给用户。

Das obige ist der detaillierte Inhalt vonEine ausführliche Einführung zur Vermeidung von SQL-Injection in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn