Maison  >  Article  >  développement back-end  >  Comment empêcher l'injection de MySQL en PHP et un résumé de l'utilisation de certaines fonctions anti-injection

Comment empêcher l'injection de MySQL en PHP et un résumé de l'utilisation de certaines fonctions anti-injection

伊谢尔伦
伊谢尔伦original
2017-07-17 11:32:086133parcourir

Déterminez simplement s'il existe une vulnérabilité d'injection et le principe. Le code anti-injection va et vient en fait avec ces combinaisons, et vous pouvez ensuite l'adapter selon votre propre code de programme. L'important est de connaître le principe, pourquoi ces caractères sont filtrés et quel mal ils ont.

sql语句如:select  *  from phpben where id = 1

Tutoriels vidéo mysql associés recommandés : "tutoriel mysql "

1.instruction d'injection mysql

(1) Aucun utilisateur Nom et mot de passe requis

//正常语句  
$sql ="select * from phpben where user_name='admin' and pwd ='123'";  
//在用户名框输入'or'='or'或 'or 1='1 然后sql如下  
$sql ="select * from phpben where user_name=' 'or'='or'' and pwd ='' ";  
$sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";

(2) Profitez d'un utilisateur sans saisir le mot de passe.

//正常语句  
$sql ="select * from phpben where user_name='$username' and pwd ='$pwd'";  
//利用的用户名是benwin 则用户名框输入benwin'#  密码有无都可,则$sql变成  
$sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd'";

Cela est dû au fait que l'une des annotations dans MySQL est "#". Le # dans l'instruction ci-dessus a annoté le contenu suivant, le mot de passe peut donc être laissé vide ou saisi arbitrairement. Certaines personnes sur Internet ont dit que "/*" est utilisé pour annoter. Ce que l'auteur veut mentionner, c'est que lorsque l'annotation commence seulement et ne se termine pas par "*/", mysql signalera une erreur, et il ne le dit pas. "/**/" ne peut pas être noté, mais il est difficile d'ajouter "*/" Pour terminer la note, il y a aussi "-" qui peut également être noté dans mysql, mais veuillez noter qu'il y a au moins un espace après "-", qui est "-". Bien entendu, le code anti-injection doit prendre en compte les trois. Il y a beaucoup de choses à mentionner dans le code anti-injection, "-" n'est pas pris en compte dans le champ d'application anti-injection.

(3) Devinez le mot de passe d'un utilisateur

//正常语句  
$sql ="select * from phpben.com where user_name='$username' and pwd ='$pwd'";  
//在密码输入框中输入“benwin' and left(pwd,1)='p'#”,则$sql是  
$sql ="select * from phpben.com where user_name=' benwin' and left(pwd,1)='p'#' and pwd ='$pwd'";

(4)Élevez les privilèges lors de l'insertion de données

//正常语句,等级为1  
$sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',1) ";  
//通过修改密码字符串把语句变成  
$sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)#',1) ";  
$sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)--  ',1) ";这样就把一个权限为1的用户提权到等级5

(5) Mise à jour malveillante et supprimez

//正常语句  
$sql = "update phpben set `user_name` = ‘benwin' where id =1";  
//注入后,恶意代码是“1 or id>0”  
$sql = "update phpben set `user_name` = ‘benwin' where id =1 or id>0";  
//正常语句  
$sql = "update phpben set  `user_name` ='benwin' where id=1";  
//注入后  
$sql = "update phpben set  `user_name` ='benwin' where id>0#' where id=1";  
$sql = "update phpben set  `user_name` ='benwin' where id>0-- ' where id=1";

(6) Injection des informations de table devinées sql

//正常语句  
$sql ="select * from phpben1 where`user_name`='benwin'";  
//猜表名,运行正常则说明存在phpben2表  
$sql ="select * from phpben1 where`user_name`='benwin' and (select count(*) from phpben2 )>0#' ";  
//猜表字段,运行正常则说明phpben2表中有字段colum1  
$sql ="select * from phpben1 where`user_name`='benwin' and (select count(colum1) from phpben2 )>0#'";  
//猜字段值  
$sql ="select * from phpben1 where`user_name`='benwin' and left(pwd,1)='p'#''";

2. Certaines fonctions anti-injection et notes.

(1) ajoute des barres obliques et stripslashes.

Addslashes ajoute des slashes "'", """, "\", "NULL" à ces "'", """, "", "NULL", les stripslash sont l'inverse, ce qu'il faut payer attention ici Il s'agit de savoir si magic_quotes_gpc=ON est activé dans php.ini. S'il est activé et en utilisant des addlashes, une duplication se produira. Ainsi, lorsque vous l'utilisez, vous devez d'abord vérifier get_magic_quotes_gpc()

(2)mysql_escape_string() et mysql_ real _escape_string()

mysql_real_escape_string Doit être utilisé sous (PHP 4 >= 4.3.0, PHP 5). Sinon, vous ne pouvez utiliser que les caractères mysql_escape_string

if (PHP_VERSION >= '4.3')  
{  
$string  =  mysql_real_escape_string($string);  
}else  
{  
$string  =  mysql_escape_string($string );  
}

(3) pour remplacer les fonctions et les fonctions correspondantes
str_replace() et perg_replace() La raison pour laquelle ces fonctions sont également mentionnées ici est que ces fonctions. peut être utilisé pour filtrer ou remplacer certains caractères sensibles et mortels.

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!

Déclaration:
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