1. Introduction à l'injection SQL
L'injection SQL est l'une des méthodes d'attaque réseau les plus courantes. Elle n'utilise pas le BUG du système d'exploitation pour mettre en œuvre l'attaque, mais cible. programmeurs Négligence lors de la programmation a permis la connexion sans compte via des instructions SQL, et a même falsifié la base de données.
2. L'idée générale de l'attaque par injection SQL
1 Trouvez l'emplacement de l'injection SQL
2. type de base de données en arrière-plan
3. Mener des attaques par injection SQL en fonction de différentes caractéristiques du serveur et de la base de données
3. Exemples d'attaques par injection SQL
Par exemple, sur une interface de connexion, nécessitant la saisie du nom d'utilisateur et du mot de passe :
Vous pouvez le saisir comme ceci pour vous connecter sans compte :
Nom d'utilisateur : 'ou 1 = 1 –
Mot de passe :
Cliquez pour vous connecter, Si aucun traitement particulier n'est effectué, alors l'utilisateur illégal se connectera très fièrement (Bien sûr, certaines bases de données linguistiques API ont déjà traité ces problèmes)
Pourquoi est-ce ? Analysons-le ci-dessous :
Théoriquement, il y aura l'instruction SQL suivante dans le programme d'authentification en arrière-plan :
String sql = "select * from user_table where username= ' "+userName+" ' and password=' "+password+" '";
Lorsque le nom d'utilisateur ci-dessus et le mot de passe sont saisis, l'instruction SQL ci-dessus devient Succès :
SELECT * FROM user_table WHERE username= '’or 1 = 1 -- and password='’
Analysez l'instruction SQL :
Après la condition username=”or 1=1 username is égal à” ou 1= 1 alors cette condition réussira certainement ;
Ensuite, ajoutez deux - à la fin, ce qui signifie annotation , qui annotera les déclarations suivantes pour les rendre inefficaces. toujours être exécuté correctement, et l'utilisateur peut facilement tromper le système et obtenir une identité légale.
C'est relativement doux. S'il est exécuté
SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''
... les conséquences peuvent être imaginées...
4. Méthodes d'adaptation
Permettez-moi de parler des contre-mesures pour JSP :
1 (Méthode simple et efficace) PreparedStatement
utilise un ensemble d'instructions précompilé, qui Il a la capacité intégrée de gérer l’injection SQL, utilisez simplement sa méthode setXXX pour transmettre la valeur.
Avantages de l'utilisation :
(1). Lisibilité et maintenabilité du code.
(2).PreparedStatement améliore les performances autant que possible.
( 3). Le point le plus important est que cela améliore grandement la sécurité.
Principe :
l'injection SQL n'affecte que le processus de préparation (compilation) des instructions SQL. un effet destructeur
et le PreparedStatement est déjà préparé. La phase d'exécution ne traite que la chaîne d'entrée en tant que données,
et n'analyse et ne prépare plus l'instruction SQL, évitant ainsi l'injection SQL.
2. Utilisez expression régulière pour filtrer les paramètres entrants
Package à importer :
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版本下载
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!