Maison > base de données > tutoriel mysql > Comment empêcher l'injection SQL ? Présentation de 5 façons d'empêcher l'injection SQL

Comment empêcher l'injection SQL ? Présentation de 5 façons d'empêcher l'injection SQL

零下一度
Libérer: 2017-05-17 15:57:59
original
3403 Les gens l'ont consulté

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+" '";
Copier après la connexion

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='’
Copier après la connexion

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=''
Copier après la connexion

... 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.*;
Copier après la connexion

正则表达式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;
Copier après la connexion

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);
Copier après la connexion

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :

/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix
Copier après la connexion

修正检测SQL meta-characters的正则表达式 :

/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i
Copier après la connexion

典型的SQL 注入攻击的正则表达式 :

/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
Copier après la connexion

检测SQL注入,UNION查询关键字的正则表达式

:/((\%27)|(\’))union/ix(\%27)|(\’)
Copier après la connexion

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(\s|\+)+(s|x)p\w+/ix
Copier après la connexion

等等…..

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;
}
Copier après la connexion

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|-|+|,";
Copier après la connexion

//这里的东西还可以自己添加

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;
}
}
Copier après la connexion

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;
}
Copier après la connexion

===================================

总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。

凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。

【相关推荐】

1. 特别推荐“php程序员工具箱”V0.1版本下载

2. 分享一个SQL注入的实例过程

3. 分享五个著名的SQL注入漏洞扫描工具

4. 分享一篇使用SQL注入漏洞拖库的实例讲解

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal