鲁鲁槟 2016-07-10 17:29:28 4702次浏览 3条回复 5 2 0

作者:鲁鲁槟 出处:http://www.luluqi.cn/post/default/show-post?id=104 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

#1、什么是 sql 注入攻击

用户提交一段数据库查询代码,根据返回的结果,获得某些他想得到的数据。

比如 :查询某个管理员是否存在,一般程序员会这么写


$sql = "select * from user where name='luluyii' and password='****'";
if (查询到) {
     header("admin.php");
}else {
     header("login.php");
}

这样写,容易被人通过 sql 注入攻击进入你的 admin.php 页面。

#2、万能密码和万能用户名

(1)方式一

① 万能密码

$sql = "select * from user where name='**' and password='***' or 1='1'";

即万能密码是:**' or 1='1

② 万能用户名

$sql = "select * from user where name='**' union select * form user/* and password='***';

/*表示不执行后面的语句,即万能用户名是:**' union select from user/

(二)方式二

$sql = 去掉 '$name''$password'的单引号;

这种写法,没有' ',mysql数据库会把你的输入当数字对待

① 使用万能密码:数字 union select * form user

② 使用万能用户名:数字 union select form user/

#3、防止用户登录注入

(1)在php.ini 中开启 magic_quotes_gpc = On,但是这个特性在 php 5.3.0 中已经废弃,并且在 php 5.4.0 中已经移除。

若配置了,方式一中的万能用户名和万能密码将失效,但是方式二仍然有效。

原因是:当改为 on 之后,Apache 服务器会对 ' 加入 \ 转义,如name = 'luluyii',当数据库执行时,变成 name = \'luluyii\'

(2)密码对比法

① 基本思想:改变验证数据库用户逻辑。

首先通过用户输入的用户名去查询数据库,如果查询到这个用户对应的密码,和用户提交的密码对比,相同则说明该用户合法,否则不合法。

$sql = "select password form user where name='luluyii'"; 
if(从数据库查询到的密码 == 用户输入的密码){ 
    header("admin.php"); 
}else{ 
    header("login.php"); 
}

分析:这样写,用户无法通过 password = 注入攻击,因为 if( == ) 是在php中验证的。

② 使用 pdo 的预编译来解决 sql 注入

首先在 php,ini 中启用 pdo:extension = php_pdo_mysql.dll

$mypdo = new PDO("mysql:localhost;port=3306;dbname=luluyii","root","root");
$pdoStatment = $mypdo->prepare($sql); //预编译
$pdoStatment->execute(array($name,$password)); //接收
$pdoStatment->fetch(); //取出结果

#4、php 搜索引擎中 sql 注入问题

(1)一般使用 _ _ 和 % 攻击,获取所有数据

(2)防止查询 sql 攻击

$keyWord = addslashes($keyWord); //使用反斜杠引用字符串
$keyWord = str_replace("%","\%",$keyWord); //将 % 替换为 \%
$keyWord = str_replace("_","\_",$keyWord); //将 _ 替换为 \_

#5、总结

sql 注入的方式还有其它很多形式,我们要写出健壮安全的代码,就要不断提高编写安全代码的意识,让我们的代码更符合

商业要求。

觉得很赞
您需要登录后才可以回复。登录 | 立即注册