SQL Injection(SQL注入)介绍及SQL Injection***检测工具

1.关于SQL Injection
迄今为止,我基本没有看到谁写出一篇很完整的文章,或者说很成熟的解决方案(能作到 的人确定不少,问题是没有流传开来,很遗憾) 我简单的说几点,但愿启发你们思考,起到抛砖引玉的做用
 
1、SQL Injection的原理
SQL Injection的实现方法和破坏做用有不少,但万变不离其宗,其原理能够归纳为一句话 :SQL Injection就是向服务器端提交事先准备好的数据,拼凑出***者想要的SQL语句,以改变数据库操做执行计划。

我想,这么说也许不算精炼,但意思应该很明确了,这句话主要包含这么三层意思:
1.***者经过何种途径注入?
存在SQL Injection漏洞的地方都是应用程序须要根据客户端环境构造SQL语句的地方。由此能够推论,只要存在"客户端数据替换预约义变量"的地方,就有可能被注入。
客户端提交数据能够有不少种方式:GET,POST,Client-Agent,Cookie,Server Enviroment...

2.***者为何能够将它想要的语句"注入"?
由于服务器端应用程序采用拼凑(请特别留意这个词)SQL语句的方式,这使得***者有机会在提交的数据中包含SQL关键字或者运算符,来构造他们想要的语句。

3.SQL Injection最终结果是什么?
改变数据库操做执行计划。
这个结果不必定是恶意的,只要你的SQL语句没有按照你预期的计划(plan)执行,那么就 能够视为被注入了,无论提交数据的人是否是恶意的。
设有这样的sql语句:
update tableName set columnName1 = " $Client_Submit_Data " where PK_ID = 1234
$Client_Submit_Data是一个变量,它表明客户端提交的数据,这里我就无论环境是ASP还 是PHP仍是其余什么东西了。
假设这个操做是要更新一篇文章的标题,不少人是否是会这么构造SQL语句?咱们看看$Cl ient_Submit_Data包含引号的状况,令$Client_Submit_Data = 谁能告诉我"sql injecti on"是什么?
那么sql语句将被拼凑成这样:
update tableName set columnName1 = "谁能告诉我"sql injection"是什么?" where PK_ID = 1234
执行结果很明显,将执行这样的语句:update tableName set columnName1 = "谁能告诉我"
where子句被忽略掉了,很遗憾,你的数据库中全部文章标题都会被update为"谁能告诉我 "
 
在这个例子当中,用户应该是无意的——标题里面包括引号应该很正常吧——但结果却和SQL Injection无异。
好啦,说了半天废话,言归正传,说一下如何应对这种问题。
 
我相信这里的朋友都看过不少防止SQL Injection的文章了,也大都会经过replace来防范一些注入,问题是:大家知其然的时候是否知其因此然?
我认为,完全解决SQL Injection的最好方法是:避免拼凑SQL语句。这就是我在上面要你们特别注意拼凑这个词的缘由。

SQL Injection之因此有隙可乘,是由于绝大多数Server Application采用拼凑SQL语句的方式来构建应用程序(阅读这个帖子的诸位,大家回首想一想本身的项目,有几个不是经过拼凑SQL语句的方式来操做数据库?想一想大家见过的被注入的案例,有几个不是采用的拼凑SQL语句的应用),所谓拼凑SQL语句,简单一点说就是:用链接字符串操做(ASP中的&和PHP中的.)将SQL关键字和客户端提交的数据链接起来并发送给DBMS执行。这样作直接致使 DBMS根本不知道你计划(plan to)作什么,而只知道你要(is to)作什么,不是吗,服务器端脚本老是将要执行的SQL语句构造好,而后发给数据库,DBMS根本不知道客户端数据 替换了变量以后,这个语句的执行计划是否有变化。服务器端脚本老是粗暴的告诉DBMS:你只管这么作好了,别问我为何。就像上面我提到的更新文章标题的例子,DBMS不知道你只想更新第1234篇文章的标题,它觉得你就是要把全部的标题都变成这个,由于你的语句就是没有where子句嘛!
 
说到这里,可能你们都明白了,所谓的最好方法是Stored Procedure。Yes! That is!
要想作出安全可靠的Server application,你最好把本身看成两我的,一个DBA,一个Coder(ASP Coder,PHP Coder or others),不少人每每只知道:我在作一个BBS,我在作一个留言本,我在作一个新闻发布系统,咱们的流程都是这样的,给用户一个表单,让用户提交,而后去写数据库,用的时候根据条件把数据记录找出来,而后显示。没事,若是你 是一个业余爱好者,只想本身写点小东西玩玩,这足够了!若是你想把WebDev做为你的职业,或者说,你想成为一个很是专业的业余爱好者,你必须当本身是一个DBA+Coder,至于要不要是一个Designer就看你的能力和精力咯!
 
好了,点到为止,我就说这么多,完全的解决方法是要在DBMS上写入你的数据操做计划,让服务器在开始执行以前知道你的意图,不要粗暴的告诉它:我就是要你执行这个命令,不要问我为何!
 
实现方法嘛,目前比较广泛的,也比较容易实现的就是存储过程了,应用存储过程不只能够从根本上解决SQL Injection这个安全问题,还会使得你的应用程序速度成倍增加(这个增加的幅度甚至可能达到一个数量级,这跟不少因素有关,很差一律而论),还会使得你开发的系统更想大型系统,拥有更好的架构体系(例如MVC模式)。
 
在 MySQL 4.1.x及其后续版本和ODBC中,提供了一种叫作prepared statements的东西,它 本质上也是一种存储过程,一种系统预置(相对于用户自定义)的存储过程。
若是你没有条件用上存储过程(好比数据库不支持,MySQL,Access,SQLite等都不支持),那么就只能将SQL Injection扼杀在摇篮里了。解决方法,我也只简单的说一句:不要相信任何来自客户端的数据。这个客户端的数据,能够经过不少途径被提交,好比get,post ,cookie,browser参数,IP地址,等等,只要不是服务器上获取的就都算客户端数据,只要是客户端数据,都是不可信的,在TCP/IP这个大框架下,什么都是能够伪造的,包括IP地址。
 
凡是来自客户端的数据,必须校验——注意是校验,不是过滤。基本上,无论你多聪明多细心(哪怕像我同样,不准笑,不准笑,严肃点,严肃点,咱们这儿讲SQL Injection呢) 也没法穷举可能被用于SQL Injection的符号和关键字,也没法预知替换掉他们是否会有副 做用,最好的办法是不去判断什么数据不符合条件,而改由判断什么数据符合条件,假设你的一个系统用户名只能是字母数字和下划线,那么你就能够用[0-9a-zA-Z_]+这个正则来匹配它,若是不符合条件,拒之便可,这比费尽心思去过滤单引号分号逗号空格什么的要明了和简洁的多。
固然若是你嫌存储过程麻烦,你也可使用参数化SQL语句,至少在asp.net能够这么作,请见本人的一篇文章:《在ADO.NET中使用参数化SQL语句的大同小异》,网址是: http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx ,介绍在asp.net中使用参数化SQL语句应注意的事项。
 
春节前夕,数万个用PHPBB做为论坛的网站被攻陷,你们有印象吗?罪魁祸首只是一个单引 ,尽管PHP有magic_quotes_gpc,可仍是被干掉了,缘由是%2527在url_decode函数中会被解析为%27(由于%25就是百分号),%27正是引号,By the way,尽管博客中国的论坛也 是基于PHPBB的,可是那次咱们幸免于难,由于在那以前咱们被黑过一次了(汗),就是由于这个,哈哈! 其实,SQL Injection不是ASP编程领域特有的,Web开发最容易碰到,但Desktop Application也有,只要有数据库的地方,只要采用拼凑SQL语句的方式,就可能存在Injection的机会,你们牢记,若是有条件,尽可能把数据DBMS职责范围的事情交给DBMS去作,若是没条件,必定要注意校验客户端提交的数据,固然,左右开弓也行,^_^
 
好了,最后,说句话给那些有志于从事WebDev工做的朋友,若是未来你进入这个领域,你把总结出来这篇文章,你应该会很顺利的经过面试,并获得一个不错的薪水等级。
 
附:微软发布3款SQL Injection***检测工具
随着 SQL INJECTION ***的明显增多,微软近日发布了三个免费工具,帮助网站管理员和检测存在的风险并对可能的***进行拦截。
 
这个微软和 HP合做开发的工具,会在网站中爬行,对全部网页的查询字符串进行分析并发现其中的 SQL INJECTION 风险。Scrawlr 使用了部分 HP WebInspect  相同的技术,但只检测 SQL INJECTION 风险。Scrawlr 从一个起始 URL 入口,爬遍整个网站,并对站点中全部网页进行分析以找到可能存在的漏洞。
 
这款被称做 MSCASI 的工具能够检测 ASP 代码并发现其中的 SQL INJECTION 漏洞(ASP 代码以 SQL INJECTION 漏洞著称),你须要向 MSCASI 提供原始代码,MSCASI 会帮你找到存在风险的代码位置。
 
该工具会让 IIS 限制某些类型的 HTTP 请求,经过对特定 HTTP 请求进行限制,能够防止某些有害的请求在服务器端执行。UrlScan 经过一系列关键词发现恶意请求,并阻止恶意请求的执行。
相关文章
相关标签/搜索