php的sql注入攻击 [ 新手入门 ]
作者:鲁鲁槟 出处: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 注入的方式还有其它很多形式,我们要写出健壮安全的代码,就要不断提高编写安全代码的意识,让我们的代码更符合
商业要求。
共 3 条回复
鲁鲁槟 东莞
最后登录:2024-08-09
在线时长:124小时36分
- 粉丝110
- 金钱5620
- 威望140
- 积分8260