当前位置:七道奇文章资讯网站建设网站编程
日期:2010-11-19 19:35:00  来源:本站整理

PHP MYSQL 注入攻击的技术实现与预防办法[网站编程]

赞助商链接



  本文“PHP MYSQL 注入攻击的技术实现与预防办法[网站编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

近在折腾 PHP + MYSQL 的编程.理解了一些 PHP SQL 注入攻击的知识,于是写了这篇文章,总结一下经验.在我看来,引发 SQL 注入攻击的主要缘由,是因为以下两点缘由:

  1. php 配置文件 php.ini 中的 magic_quotes_gpc 选项没有翻开,被置为 off

  2. 开辟者没有对数据范例举行查抄和转义

  不过事实上,第二点最为重要.我认为, 对用户输入的数据范例举行查抄,向 MYSQL 提交精确的数据范例,这应当是一个 web 程序员最最基本的本质.但实际中,常常有很多小白式的 Web 开辟者忘了这点, 从而招致后门大开.

  为什么说第二点最为重要?因为假如没有第二点的保证,magic_quotes_gpc 选项,不管为 on,还是为 off,都有大概引发 SQL 注入攻击.下面来看一下技术实现:

 一. magic_quotes_gpc = Off 时的注入攻击


  magic_quotes_gpc = Off 是 php 中一种非常不安全的选项.新版本的 php 已经将默许的值改成了 On.但仍有相当多的服务器的选项为 off.毕竟,再古玩的服务器也是有人用的.

  当magic_quotes_gpc = On 时,它会将提交的变量中全部的 '(单引号)、"(双号号)、\(反斜线)、空白字符,都为在前面自动加上 \.下面是 php 的官方阐明:

magic_quotes_gpc boolean

Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically

  假如没有转义,即 off 情形下,就会让攻击者有机可乘.以下列测试脚本为例:

http://www.xiaohui.com/weekly/20070314.htm

  1. <?  
  2. if ( isset($_POST["f_login"] ) )  
  3. {  
  4. // 衔接数据库...  
  5. // ...代码略...  
  6.  
  7. // 查抄用户能否存在  
  8. $t_strUname = $_POST["f_uname"];  
  9. $t_strPwd = $_POST["f_pwd"];  
  10. $t_strSQL = "SELECT * FROM tbl_users WHERE username='$t_strUname' AND password = '$t_strPwd' LIMIT 0,1";  
  11.  
  12. if ( $t_hRes = mysql_query($t_strSQL) )  
  13. {  
  14. // 成功查询之后的处理. 略...  
  15. }   
  16. }  
  17. ?>  
  18.  
  19. <html><head><title>sample test</title></head>  
  20. <body>  
  21. <form method=post action="">  
  22. Username: <input type="text" name="f_uname" size=30><br>  
  23. Password: <input type=text name="f_pwd" size=30><br>  
  24.  
  25. <input type="submit" name="f_login" value="登录">  
  26. </form>  
  27. </body>  
  28.  


  在这个脚本中,当用户输入正常的用户名和密码,假定值辨别为 zhang3、abc123,则提交的 SQL 语句以下:

SELECT * FROM tbl_users
WHERE username='zhang3' AND password = 'abc123' LIMIT 0,1
 

假如攻击者在 username 字段中输入:zhang3' OR 1=1 #,在 password 输入 abc123,则提交的 SQL 语句变成以下:

SELECT * FROM tbl_users
WHERE username='zhang3' OR 1=1 #' AND password = 'abc123' LIMIT 0,1
由于 # 是 mysql中的注释符, #之后的语句不被履行,实现上这行语句就成了:

SELECT * FROM tbl_users
WHERE username='zhang3' OR 1=1

这样攻击者便可以绕过认证了.假如攻击者知道数据库构造,那么它构建一个 UNION SELECT,那就更危险了:

  假定在 username 中输入:zhang3 ' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #

  在password 输入: abc123,

  则提交的 SQL 语句变成:

SELECT * FROM tbl_users
WHERE username='zhang3 '
OR 1 =1 UNION select cola, colb,cold FROM tbl_b #' AND password = 'abc123' LIMIT 0,1
这样就相当危险了.假如agic_quotes_gpc选项为 on,引号被转义,则上面攻击者构建的攻击语句就会变成这样,从而无法到达其目的:

SELECT * FROM tbl_users
WHERE username='zhang3\' OR 1=1 #'
AND password = 'abc123'
LIMIT 0,1

SELECT * FROM tbl_users
WHERE username='zhang3 \' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #'
AND password = 'abc123' LIMIT 0,1


  以上是“PHP MYSQL 注入攻击的技术实现与预防办法[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 编写PHP代码总结
  • 10个风趣的 PHP 教程
  • PHP汉字转换拼音的类
  • 来点新手PHP学习心得
  • php应用readfile函数给躲藏下载文件地址增添权限判
  • PHP小研究拿出来和大家分享
  • 10 个有意思的 PHP 教程
  • PHP常常简单记乱的知识
  • PHP入门指导:若何学习PHP?
  • PHP中文件包含语句的辨别
  • PHP浮点数显示和转成字符串
  • PHP的chm手册打不开怎么办
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .