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
- <?
- if ( isset($_POST["f_login"] ) )
- {
- // 衔接数据库...
- // ...代码略...
- // 查抄用户能否存在
- $t_strUname = $_POST["f_uname"];
- $t_strPwd = $_POST["f_pwd"];
- $t_strSQL = "SELECT * FROM tbl_users WHERE username='$t_strUname' AND password = '$t_strPwd' LIMIT 0,1";
- if ( $t_hRes = mysql_query($t_strSQL) )
- {
- // 成功查询之后的处理. 略...
- }
- }
- ?>
- <html><head><title>sample test</title></head>
- <body>
- <form method=post action="">
- Username: <input type="text" name="f_uname" size=30><br>
- Password: <input type=text name="f_pwd" size=30><br>
- <input type="submit" name="f_login" value="登录">
- </form>
- </body>
在这个脚本中,当用户输入正常的用户名和密码,假定值辨别为 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 注入攻击的技术实现与预防办法[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |