PHP开发中常见的安全问题详解和解决方法(如S(3)


//正常语句 
$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'";


如果运行正常则密码的密码第一个字符是p,同理猜解剩下字符。

(4)插入数据时提权

复制代码 代码如下:


//正常语句,等级为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)更新提权和插入提权同理

复制代码 代码如下:


//正常语句 
$sql = "update phpben set  `user_name` ='benwin', level=1"; 
//通过输入用户名值最终得到的$sql 
$sql = "update phpben set  `user_name` ='benwin',level=5#', level=1"; 
$sql = "update phpben set  `user_name` ='benwin',level=5--  ', level=1";



(6)恶意更新和删除

复制代码 代码如下:


//正常语句 
$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";



(7)union、join等

复制代码 代码如下:


//正常语句 
$sql ="select * from phpben1 where `user_name`='benwin' "; 
//注入后 
$sql ="select * from phpben1 where`user_name`='benwin' uninon select * from phpben2#' "; 
$sql ="select * from phpben1 where`user_name`='benwin' left join……#' ";



(8)通配符号%、_

复制代码 代码如下:


//正常语句 
$sql ="select * from phpben where `user_name`='benwin' "; 
//注入通配符号%匹配多个字符,而一个_匹配一个字符,如__则匹配两个字符 
$sql ="select * from phpben where `user_name` like '%b' "; 
$sql ="select * from phpben where `user_name` like '_b_' ";


这样只要有一个用户名字是b开头的都能正常运行,“ _b_”是匹配三个字符,且这三个字符中间一个字符时b。这也是为什么有关addslashes()函数介绍时提示注意没有转义%和_(其实这个是很多phper不知问什么要过滤%和_下划线,只是一味的跟着网上代码走)

(9)还有很多猜测表信息的注入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'#''";

当然还有很多,笔者也没研究到专业人士那种水平,这里提出这些都是比较常见的,也是phper应该知道并掌握的,而不是一味的在网上复制粘贴一些防注入代码,知然而不解其然。

下面一些防注入方法回看可能更容易理解。

3.3防注入的一些方法

3.3.1 php可用于防注入的一些函数和注意事项。

(1)addslashes 和stripslashes。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9b60f9a26cc0359ef55395098f85bfd1.html