记一次mysql注入漏洞修复

最近公司运行在阿里云上的一个项目出现报警,说有sql整形注入漏洞。然后老板叫我去调查解决,一开始我是...算了干活要紧。


去阿里云上看报警,长这样


红色的大字写的很清楚,恩,不知道咋办就先点进去看看


这个是已经修复好的样子,在这之前“文件已修改”的位置是“漏洞待修复”之类的字样,也是红的


ok,确实有问题,那就去看代码


smarty...    这个框架是个人感觉最不好玩的了


而且代码里也看不出什么问题,那么怎么办呢?突然我想起来阿里云web漏洞列表里有一个文件的图标,上面赫然写着



我勒个去,高大上啊


点击查看才发现里面给详细描述了怎么去修复代码,这时我猜恍然大悟


原来sql的条件传值没有定义类型,这么大的漏洞当时是谁干的...

这个原理我倒是明白,就是说当你没有对传入的参数进行类型转换的话(int就只能接收int,string要trim),很有可能就被人利用你的这个参数漏洞写入一个直接就能通过的sql

举个栗子:你原来的sql是  “SELECT  * FROM USERS WHERE id = ”.$id   你对$id没有处理,那别人就直接传入一个 id OR 1=1;    这样一来这个sql就变成了 “SELECT *FROM USERS WHERE id = id OR 1=1”; 这个sql永远可以执行,而且攻击者同时能够获得你的user信息


闲话少说,开始按照阿里云给的方案改一下,上传代码,点击修复方案旁边的操作里面的测试,好了




但是这样就完了吗,感觉很不放心,然后去网上查了一下大神们的关于sql注入的理解和应对方法

查来查去有用这个方法的,还有推荐用PDO(PHP data objects)的

官方对PDO的解释是 

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。


那么为什么要用PDO呢  先来看看PHP MANUAL对PDO的定义。

[原文]
The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP. Each database driver that implements the PDO interface can expose database-specific features as regular extension functions. Note that you cannot perform any database functions using the PDO extension by itself; you must use a database-specific PDO driver to access a database server.

PDO provides a data-access abstraction layer, which means that, regardless of which database you're using, you use the same functions to issue queries and fetch data. PDO does not provide a database abstraction; it doesn't rewrite SQL or emulate missing features. You should use a full-blown abstraction layer if you need that facility. 
[译文]
PDO扩展为PHP定义了一个访问数据库的轻量的,持久的接口。实现了PDO接口的每一种数据库驱动都能以正则扩展的形式把他们各自的特色表现出来。注意;利用PDO扩展本身并不能实现任何数据库函数。你必须使用一个特定的数据库PDO驱动去访问数据库。
PDO提供了一个数据访问抽象层,这就意味着,不管你使用的是哪种数据库,你都可以用同样的函数去进行查询的获取数据。PDO并不提供数据提取,它不会重写SQL语句,或者模仿这些功能。你需要使用一个成熟的提取层,如果你需要的话。

1、更换数据库是去的极大便利

2、极大提高程序运行效率

来源:http://www.lamper.cn/html/2007/02-05/59.html






你可能感兴趣的:(记一次mysql注入漏洞修复)