论文部分内容阅读
摘 要:在php+mysql的站点开发时,经常出现程序员编写代码的时候,没有对用户输入数据合法性进行判断,使站点存在安全隐患,本文从php+mysql注入的原理入手,对于使用php+mysql数据库的站点,在sql注入常用的方法和解决办法方面进行了研究。
关键词:Php mySql注入漏洞;分析
中图分类号:TP309.5文献标识码:A
On Analysis and Prevention of Php+mySql Injection
LV Kang1,FAN Jin-wei2
(1.Zhengzhou University,Henan Zhengzhou 450000;2.Zhengzhou Commerce and Trade Technicians College,Henan Zhengzhou 450000)
Key words: Php+mySql;injiection;analysis;prevention
在Php+Mysql的站点开发时,经常出现程序员编写代码的时候,没有对用户输入数据合法性进行判断,使站点存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得信息,这就是所谓的SQL injection,即SQL 注入。SQL注入是从正常的www端口访问,而且表面看起来和一般的Web页面访问没有什么区别,而且目前市面上的防火墙都不会对SQL注入发出警报,如果管理员没有查看日志的习惯,可能在不知不觉中被攻击。国内研究PHP的人比研究ASP的人少得多,对asp+mssql或access注入研究的也比较多,有很多这样的文章,况且PHP的安全性比ASP高很多。本文主要从Php+mySql注入定义和原理出发,通过实例的研究,给站点开发者以提醒。
1 Php+Mysql注入原理
在Php+Mysql站点日益增多的今天,SQL注入仍是最有效最麻烦的一种攻击方式,有效是因为至少70% 以上的站点,包括国内大部分安全站点存在SQL Injection漏洞,因为MYSQL4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为On时。提交的变量中所有的‘(单引号),“(双引号),\(反斜线)and空字符会自动转为含有反斜线的转义字符,给SQL注入者一定的障碍。
以下面两句SQL语句:①SELECT* FROM article WHERE articleid='$id' ②SELECT * FROM article WHERE articleid=$id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入语句,来看看不同之处。
①指定变量$id为:1' and 1=2 union select * from user where userid=1/*
此时整个SQL语句变为:SELECT * FROM article WHERE articleid='1' and 1=2 union select * from user where userid=1/*'
②指定变量$id为:
1 and 1=2 union select * from user where userid=1
此时整个SQL语句变为:SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1
由于第一句有单引号,必须先闭合前面的单引号,这样才能使后面的语句作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就可以了。
2 实例应用
我们拿一个用户验证的例子,看看如何学习构造有效的SQL语句。首先建立一个数据库和一个数据表并插入一条记录,如下:
CREATE TABLE `user` (`userid` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL default '',
`password` varchar(20) NOT NULL default '',
PRIMARY KEY (`userid`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
#
# 导出表中的数据 `user`
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
验证用户文件的代码如下:
<?php
$servername=“localhost”;
$dbusername=“root”;
$dbpassword=“”;
$dbname=“injection”;
mysql_connect($servername,$dbusername,$dbpassword) or die(“数据库连接失败”);
$sql=“SELECT * FROM user WHERE username='$username' AND password='$password'";
$result=mysql_db_query($dbname, $sql);
$userinfo=mysql_fetch_array($result);
if (empty($userinfo))
{
echo“登陆失败”;
} else {
echo“登陆成功”;
}
echo“<p>SQL Query: $sql<p>”;
?>
用http://127.0.0.1/injection/user.php?username=angel' or '1=1访问时显示“登陆成功”,说明成功了。或者提交:http://127.0.0.1/injection/user.php?username=angel'/*
或http://127.0.0.1/injection/user.php?username=angel'%23
我们提交的第一句是利用逻辑运算,在ASP中运用可以说是非常广泛的,第二、三句是根据mysql的特性,mysql支持/*和#两种注释格式,在提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IE地址栏里提交#会变成空的,这个要比逻辑运算简单得多了,由此可以看出PHP比ASP强大灵活。
关键词:Php mySql注入漏洞;分析
中图分类号:TP309.5文献标识码:A
On Analysis and Prevention of Php+mySql Injection
LV Kang1,FAN Jin-wei2
(1.Zhengzhou University,Henan Zhengzhou 450000;2.Zhengzhou Commerce and Trade Technicians College,Henan Zhengzhou 450000)
Key words: Php+mySql;injiection;analysis;prevention
在Php+Mysql的站点开发时,经常出现程序员编写代码的时候,没有对用户输入数据合法性进行判断,使站点存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得信息,这就是所谓的SQL injection,即SQL 注入。SQL注入是从正常的www端口访问,而且表面看起来和一般的Web页面访问没有什么区别,而且目前市面上的防火墙都不会对SQL注入发出警报,如果管理员没有查看日志的习惯,可能在不知不觉中被攻击。国内研究PHP的人比研究ASP的人少得多,对asp+mssql或access注入研究的也比较多,有很多这样的文章,况且PHP的安全性比ASP高很多。本文主要从Php+mySql注入定义和原理出发,通过实例的研究,给站点开发者以提醒。
1 Php+Mysql注入原理
在Php+Mysql站点日益增多的今天,SQL注入仍是最有效最麻烦的一种攻击方式,有效是因为至少70% 以上的站点,包括国内大部分安全站点存在SQL Injection漏洞,因为MYSQL4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为On时。提交的变量中所有的‘(单引号),“(双引号),\(反斜线)and空字符会自动转为含有反斜线的转义字符,给SQL注入者一定的障碍。
以下面两句SQL语句:①SELECT* FROM article WHERE articleid='$id' ②SELECT * FROM article WHERE articleid=$id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入语句,来看看不同之处。
①指定变量$id为:1' and 1=2 union select * from user where userid=1/*
此时整个SQL语句变为:SELECT * FROM article WHERE articleid='1' and 1=2 union select * from user where userid=1/*'
②指定变量$id为:
1 and 1=2 union select * from user where userid=1
此时整个SQL语句变为:SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1
由于第一句有单引号,必须先闭合前面的单引号,这样才能使后面的语句作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就可以了。
2 实例应用
我们拿一个用户验证的例子,看看如何学习构造有效的SQL语句。首先建立一个数据库和一个数据表并插入一条记录,如下:
CREATE TABLE `user` (`userid` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL default '',
`password` varchar(20) NOT NULL default '',
PRIMARY KEY (`userid`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
#
# 导出表中的数据 `user`
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
验证用户文件的代码如下:
<?php
$servername=“localhost”;
$dbusername=“root”;
$dbpassword=“”;
$dbname=“injection”;
mysql_connect($servername,$dbusername,$dbpassword) or die(“数据库连接失败”);
$sql=“SELECT * FROM user WHERE username='$username' AND password='$password'";
$result=mysql_db_query($dbname, $sql);
$userinfo=mysql_fetch_array($result);
if (empty($userinfo))
{
echo“登陆失败”;
} else {
echo“登陆成功”;
}
echo“<p>SQL Query: $sql<p>”;
?>
用http://127.0.0.1/injection/user.php?username=angel' or '1=1访问时显示“登陆成功”,说明成功了。或者提交:http://127.0.0.1/injection/user.php?username=angel'/*
或http://127.0.0.1/injection/user.php?username=angel'%23
我们提交的第一句是利用逻辑运算,在ASP中运用可以说是非常广泛的,第二、三句是根据mysql的特性,mysql支持/*和#两种注释格式,在提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IE地址栏里提交#会变成空的,这个要比逻辑运算简单得多了,由此可以看出PHP比ASP强大灵活。