Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290472
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1474
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-25 10:56
文章分类
文章存档

2014年(25)

2013年(32)

分类: 网络与安全

2013-08-01 11:32:32

1.什么是SQL注入,猛戳wikipedia查看

2.本地测试代码:

如果表单提交正确,就打印hello,“username”

否则,打印“404 not found!”

    require 'config.php';
    $DBConnection = mysql_connect ( "$dbhost", "$dbuser", "$dbpwd" );
    mysql_select_db ( "$dbdatabase" );
     
    if(isset($_GET['submit']) && $_GET['submit']){     
    $sql="select * from test where name='".$_GET['username']."'and password='".$_GET['password']."'";
    //echo $sql;exit;  
    $result=mysql_query($sql,$DBConnection);     
    $num=mysql_num_rows($result);        
    if($num>=1)
    {
        echo "hello,".$_GET['username'];
    }
    else {
        echo"404 not found";
    }
}
?>


   
       
       
       
       
       
       
   
username password submit


3.浏览器界面显示:
 

 

4.重头戏,sql注入:

 

 

 

5.原理--为什么用户名不正确,却可以显示hello?

我可以echo一下:

 

 
$sql="select * from test where name='".$_GET['username']."'and password='".$_GET['password']."'";
echo $sql;exit;
 

显示:

 

拿到我的mysql数据库中查询:

 

 

可以看到,居然能查到信息,因为sql语句中,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果。

6.小结:

1)其实这个sql注入过程上很简单,困难的地方在于提交SQL注入语句的灵活性上面,单引号的使用很关键,另外,多用echo打印调试也很值得一试~~

2)GET方式提交表单很危险,所以还是用POST方式吧!

3)防止SQL注入:可以看出,sql注入就是用户提交一些非法的字符(如本文的单引号’和sql语句的注释号--,还有反斜杠\等),所以要用转义:  htmlspecialchars函数,mysql_read_escape_string函数都可以实现。

4)JS段验证表单了,JSP/PHP等后台还要验证码?

     ---需要,因为friebug可以禁用JS
阅读(1127) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~