您当前的位置: 首页 > 数据库教程 > Oracle教程 > GreenSQL助力防止SQL注入攻击

GreenSQL助力防止SQL注入攻击

作者:guanchaofeng 来源:本站整理 发布时间: 2009-06-19 22:02 点击:
QL注入攻击的危害早已为人所熟知,这种攻击准许攻击者在你的数据库上执行任意的SQL命令。要对付这种攻击,我们对于Web用户所提供的任何数据,不管是通过HTTP方式,还是通过CGI参数方式提供的,都要经过验证,以确保其不包含非法信息。 这是解决问题的根本之

GreenSQL助力防止SQL注入攻击

  QL注入攻击的危害早已为人所熟知,这种攻击准许攻击者在你的数据库上执行任意的SQL命令。要对付这种攻击,我们对于Web用户所提供的任何数据,不管是通过HTTP方式,还是通过CGI参数方式提供的,都要经过验证,以确保其不包含非法信息。
  
  这是解决问题的根本之道。我们需要一种工具。许多安全机构和人员提出了不少对付这种攻击的方法。今天我们看一个不错的工具GreenSQL,可以说它是一个MySQL数据库防火墙,可以过滤SQL注入攻击。
  
  它位于网站和MySQL数据库之间,可以决定哪些SQL语句可以执行,哪些不应当执行。再加上其Web界面,使得用户可以通过浏览器来管理GreenSQL。GreenSQL的设计目的就是用作MySQL数据库的一个代理服务器。它不是将用户的请求直接连接到MySQL数据库,而是连接到GreenSQL。GreenSQL将合法的SQL提交给MySQL数据库并返回结果。
  
  如果GreenSQL检测到一条不属于白名单并包含恶意SQL的语句,它将阻止此SQL并返回一个空结果,不与MySQL数据库发生联系。笔者完成此文时,Fedora、openSUSE、Ubuntu等Linux发行版本并没有包含GreenSQL。
  
  在本文中,笔者将在一台64位的Fedora9计算机上从源代码安装greensql-fw0.8.4。安装过程并没有使用自动化的工具,所以必须手动设置一些东西,如配置文件、系统用户、MySQL配置、日志文件、/etc/init.d等。这些过程在install.txt文件中有明确说明,所以并不太费力。当然,通过执行脚本字典中的几个脚本外壳,你也可以完成安装的不少内容。为编译应用程序,可以简单地执行“make”,如下所示:
  
  $tarxzf/.../greensql-fw-0.8.4.tar.gz
  
  $cdgreensql-fw-0.8.4/
  
  $make
  
  ...
  
  connection.hpp:29:error:field'proxy_event'hasincompletetype
  
  connection.hpp:30:error:field'client_event'hasincompletetype
  
  可以看出,在编译开始后,我们收到了几个错误,这是由于在Fedora9上安装时,笔者并没有安装libevent-devel。在安装好libevent-devel后,又发现需要修改/usr/include/event.h,为编译事件代码,需要将sys/types.h包括进去。vi/usr/include/event.h...#include#include#include#include
  
  在使用“make-k”命令时,有几个文件又出现了差错,这些文件调用了字符串函数,如“strcasecmp”,这是由于没有包括string.h头文件所致。对读者来说,根据所使用的gcc的版本的不同,在编译GreenSQL时,可能会出现类似或不类似于下面的一些问题:$cdsrc$vimysql/mysql_con.cpp...//License:GPLv2(http://www.gnu.org/licenses/gpl.html)//#include
  
  #include"mysql_con.hpp"...$viconfig.hpp...#ifndefGREEN_SQL_CONFIG_HPP#define
  
  GREEN_SQL_CONFIG_HPP#include...$vi../src/parser/expression.hpp...#ifndef_SQL_EXPRESSION_HPP_
  
  #define_SQL_EXPRESSION_HPP_#include...
  
  如果你在一个64位的发行版本上编译GreenSQL,可能还需要稍稍修改Makefile,这样编译生成程序才能检查lib64而不是lib目录,如下所示:$visrc/Makefile...LIBS:=-L/usr/local/lib-L/usr/local/lib/mysql-L/usr/lib64/mysql-lmysqlclient-levent-lpcre
  
  greensql-fw:$(OBJS)...$make
  
  编译完成,下面显示的完成安装的命令:greensql-fw-0.8.4]#cd./scripts/#./setup_user.shdone...#./greensql-create-db.sh-----------------------------
  
  ----------------Thefollowingsettingswillbeused:MySQLadminuser:[root]MySQLadminpassword:[]MySQLserver
  
  address:[127.0.0.1]GreenSQLconfigurationDBname:[greendb]DBusertocreate:[green]Passwordtoset:[pwd]Do
  
  youwanttochangeanything?[y/N]yMySQLadminuser[root]:MySQLadminpassword[]:XXxxXXxxXXxx-FIXMEMySQL
  
  serveraddress(youcanuseip:portstring)[127.0.0.1]:GreenSQLconfigdbname[greendb]:GreenSQLDBusername
  
  [green]:greendbGreenSQLDBuserpassword[pwd]:greendbpass---------------------------------------------The
  
  followingsettingswillbeused:Doyouwanttochangeanything?[y/N]CreatingMySQLdatabase...AddingMySQLuser...CreatingMySQLtables...GreenSQLconfigurationfileisnotwritable!!!Checkthat[database]section
  
  containsthefollowingsettingsin/etc/greensql/greensql.conf[database]dbhost=127.0.0.1dbname=greendb
  
  dbuser=greendbdbpass=greendbpass#dbport=3306...#./setup_conf.shdone...#./setup_log.shdone...#
  
  ./setup_binary.shdone...#vi/etc/greensql/greensql.conf...[database]dbhost=127.0.0.1dbname=greendb
  
  dbuser=greendbdbpass=greendbpass...#chkconfig--addgreensqlservicegreensqldoesnotsupportchkconfig#
  
  /etc/init.d/greensqlstart
  
  软件包的install.txt文件描述了手动安装方法,与脚本所使用的命令相同。使用脚本可能更好一些,因为这样可以提高安装速度,而安装程序基本相同。安装指南推荐在/etc/greensql目录之前设置MySQL数据库,不过如果你这样做的话,有可能无法找到配置文件,所以你必须手动更改/etc/greensql/greensql.conf文件。你对greensql.conf作出的唯一主要更改是获取MySQL数据库参数。为测试需要,笔者创建了一个称为“test”的数据库,并允许用户“ben”自由访问,命令如下:#mysql-p
  
  Enterpassword:
  
  WelcometotheMySQLmonitor.Commandsendwith;or\g.
  
  mysql>GRANTALLONtest.*TOben@"%";
  
  mysql>FLUSHPRIVILEGES;
  
  默认情况下,GreenSQL运行在3305端口上,小于MySQL的默认端口(3306)。如果你使用mysql控制台客户端并连接到GreenSQL的3305端口上,你将无法创建新表。如果你直接通过3306端口连接到MySQL,就可以创建新表。$mysql--verbose-h127.0.0.1-P3305test
  
  mysql>createtablefoo(idint);
  
  --------------
  
  createtablefoo(idint)
  
  --------------
  
  QueryOK,0rowsaffected(0.01sec)
  
  mysql>insertintofoovalues(55);
  
  --------------
  
  insertintofoovalues(55)
  
  --------------
  
  ERROR1146(42S02):Table'test.foo'doesn'texist
  
  $mysql--verbose-h127.0.0.1-P3306test
  
  WelcometotheMySQLmonitor.Commandsendwith;or\g.
  
  mysql>createtablefoo(idint);
  
  --------------
  
  createtablefoo(idint)
  
  --------------
  
  QueryOK,0rowsaffected(0.01sec)
  
  mysql>insertintofoovalues(55);
  
  --------------
  
  insertintofoovalues(55)
  
  --------------
  
  QueryOK,1rowaffected(0.00sec)
  
  mysql>insertintofoovalues(131);
  
  --------------
  
  insertintofoovalues(131)
  
  --------------
  
  QueryOK,1rowaffected(0.00sec)
  
  mysql>select*fromfoo;
  
  --------------
  
  select*fromfoo
  
  --------------
  
  +------+
  
  id
  
  +------+
  
  55
  
  131
  
  +------+
  
  2rowsinset(0.00sec)
  
  如果使用默认配置,你将无法通过GreenSQL防火墙丢弃数据表。这倒无妨,因为表结构不太可能经常改变,更不可能通过Web界面改变。$mysql--verbose-h127.0.0.1-P3305test
  
  WelcometotheMySQLmonitor.Commandsendwith;or\g.
  
  mysql>select*fromfoo;
  
  --------------
  
  select*fromfoo
  
  --------------
  
  +------+
  
  id
  
  +------+
  
  55
  
  131
  
  +------+
  
  2rowsinset(0.00sec)
  
  mysql>droptablefoo;
  
  --------------
  
  droptablefoo
  
  --------------
  
  QueryOK,0rowsaffected(0.00sec)
  
  mysql>select*fromfoo;
  
  --------------
  
  select*fromfoo
  
  --------------
  
  +------+
  
  id
  
  +------+
  
  55
  
  131
  
  +------+
  
  2rowsinset(0.01sec)
  
  注入测试看来没有如所期望的那样正常工作。第一次测试是在条件一直为真时删除表。这会清除表内的所有数据,留下一个空表。默认地此查询会通过防火墙进行:$mysql--verbose-h127.0.0.1-P3305test
  
  mysql>deletefromfoowhere1=1;
  
  --------------
  
  deletefromfoowhere1=1
  
  --------------
  
  QueryOK,2rowsaffected(0.00sec)
  
  mysql>select*fromfoo;
  
  --------------
  
  select*fromfoo
  
  --------------
  
  Emptyset(0.00sec)
  
  对于上面的SQL删除命令来说,/var/log/greensql.log文件包含了下面的信息:SQL_DEBUG:QUERYcommand[]:deletefromfoowhere1=1
  
  SQL_DEBUG:AFTERNORM:deletefromfoowhere?=?
  
  SQL_DEBUG:RISK:0
  
  /etc/greensql/greensql.conf文件准许你设置某些内容的风险程度。例如,你可以将10指定给union关键字使用,或者在查询中使用直接的变量比较(如同1=2之类的东西)。这些变量包括“block_level=30”,所以RISK大于30的任何查询都不转发给MySQL服务器。为了让GreenSQL标记出上面的查询,笔者将risk_var_cmp_var和risk_always_true从默认的30增加至150。但很不幸,这次查询看起来仍是风险为零。SQL_DEBUG:QUERYcommand[]:deletefromfoowhereid=181or1=1
  
  SQL_DEBUG:AFTERNORM:deletefromfoowhereid=?or?=?
  
  SQL_DEBUG:RISK:0
  
  SQL_DEBUG:QUERYcommand[]:deletefromswherecomment='whatever'or'1'='1'
  
  SQL_DEBUG:AFTERNORM:deletefromswherecomment=?or?=?
  
  SQL_DEBUG:RISK:0
  
  笔者做了许多尝试,结果都是一样的,即GreenSQL都将前面的不怀好意的查询的风险看成是零,笔者又试用了一下SELECT查询。这竟然是使GreenSQL工作的一个关键,即可以阻止恶意查询,如日志文件的一个片断部分所示:SQL_DEBUG:QUERYcommand[]:select*fromfolkswherename='sam'or'1'='1'
  
  SQL_DEBUG:AFTERNORM:select*fromfolkswherename=?or?=?
  
  DEBUG:Queryhas'or'token
  
  DEBUG:Variablecomparisononly
  
  SQL_DEBUG:RISK:35
  
  由于select语句中的SQL注入允许用户在没有口令的情况可以登录进入一个站点,让GreenSQL检查一下你的select未尝不是一个好主意。不过,笔者希望GreenSQL的未来版本可以将保护扩展到delete语句,因为它可以清除整个数据表。

分享到:
本文"GreenSQL助力防止SQL注入攻击"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4