搜索
查看: 775|回复: 2

sql注入一点小心得

[复制链接]

432

主题

573

帖子

2543

积分

核心成员

Rank: 8Rank: 8

积分
2543
发表于 2013-11-11 16:31:11 | 显示全部楼层 |阅读模式
$sql = "select * from users where username = '$username' and password = '$password'";
对于这种sql,对应一个万能密码和用户名:
万能密码: xx' or 1='1
万能用户名: xx' union select * from users/*
  执行时mysql解释为:
$sql = select * from users where username = '$username' and password = ' xx' or 1='1'
不解释,瞬间破解
同样,上面是在sql语句中查询字段后的输入值加了单引号,有些时候尤其是初级程序员经常对变量不加单引号:
$sql = "select * from users where username = $username and password = $password";
这时mysql解释会被当做数字型字段来匹配
     万能密码: 11 union select * from users/*
   执行语句:
select * from users where username = 11 union select * from users/* and password = 54
查询注入
这个比较好理解,一般在页面的搜索框点击按钮搜索时在后台sql中可能会用like来查询,但如果没有加任何处理,可能输入一个% 或 __ 就会注入到sql中查询全部或部分记录,不过在php中可以使用一个函数来处理一下:
$keyword = addslashes($keyword); $keword = str_replace("%","\$",$kwyword);

插入注入
我们先模拟一个网站注册页面的sql处理语句:
insert into users(username,password,grade) values('frank','123456','1');
假如users表中grade为等级字段,并且默认字段为1,注册时用户输入用户名和密码两个字段后,后台插入语句为上面语句,则当用户输入的密码为 123456','3')/*时,执行sql为:
insert into users(username,password,grade) values('frank','123456','3')/*,'1';
这样也可以达到注入的目的
解决sql注入:
     
①. 在服务器设置将php.ini配置文件中magic_quotes_gpc设置为On
          服务器会自动将单引号转义为:\'
          不过攻击时可以将单引号写为char(13)-单引号ASCII码,也一样可以攻击
     ②. 密码比对
          通过输入的用户名获取密码,再对密码进行匹配

   $sql  = "select * from users where username ='frank'"

          $result = mysql_query($sql,$conn);

          $row = mysql_fetch_array($result);

          if($row['password'] != $password) ...

      ③. 使用pdo的PDO::prepare()预处理操作

          PDO(PHP Data Object)扩展在PHP5中加入,PHP6默认识别PDO连接数据库,pdo相当于是一个数据库抽象层,不同数据库使用相同的方法名,解决数据库连接不同意问题。

          工作原理如下:

                file:///C:/Users/changfa/AppData/Local/Temp/enhtmlclip/Image.png

          (使用时需先在php.ini中开启对pdo扩展的支持)

$sql = "select * from users where username=? and password=?"; //创建一个pdo对象 $mypdo = new PDO("mysql:host=localhost;port=3306;dbname=xx","root","123456"); //设置编码 $mypdo->exec("set names utf8"); //预处理$sql $pdostatement = $mypdo->prepare(%sql); //将用户名和密码填入sql $pdostatement->execute(array($username,$password)); //得到查询结果 $result = $pdostatement->fetch(); if(empty($result)) ...

     ④. 其他企业级解决sql注入方式:IDS(入侵检测系统)

           file:///C:/Users/changfa/AppData/Local/Temp/enhtmlclip/Image(1).png

关于sql注入对于开发工程师来说主要是防守,提高编写安全代码的意识,让我们编写的代码质量更高,安全性方面更好


​


您可以更新记录, 让好友们知道您在做什么...
854955425 该用户已被删除
发表于 2013-11-11 16:51:33 | 显示全部楼层
真是 收益 匪浅
854955425 该用户已被删除
发表于 2013-11-11 16:59:47 | 显示全部楼层
不错不错,楼主您辛苦了。。。
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表