mysql注入历来是php的一个问题,目前主要有以下几种方案:
(1)addslashes函数
(2)mysql_escape_string 和mysql_real_escape_string 函数(将被废弃或已被废弃)
(3)magic_quotes_gpc自动过滤输入(由于效率问题,5.4以后已被强制关闭,无法开启)
(4)使用pdo/mysql驱动查询,消除注入
看了网上的几篇博文,大致知道了注入的基本原理:
通过提交的数据,篡改SQL语句,使得原来的mysql逻辑被篡改,继而修改数据库的数据或者获取数据库的数据;
一般有以下几种注入攻击:
1. 验证注入:注入“and 1=1”;
2. 判断字段数:
(1)嵌入order by 1,2,3....直到报错就知道总共字段数
(2)UNION SELECT ...联合查询,不断改变字段数目,直到正常查询时,就是字段数了
3. 查询库名:在直到字段数的前提下,通过union select来查询数据库名字数据
4. 查表名:前提是查出库名,原理同查询库名
5. 查字段:前提是查出表名,原理同查询库名
6. 查数据:前提是查出字段名,原理同查询库名
然后呢,防止注入的方法:
1. 对输入字段进行过滤,如对敏感字符(如单引号,双引号等)添加反斜杠
2. 使用参数化的过滤性语句(参数化配合mysql的预编译还可以起到加速功能);
3. 避免使用解释程序
4. 避免出现一些详细的错误消息
注意:
1. addslashes和mysql_escape_string对于GBK编码有漏洞,在GBK下当遇到单引号时,只是将将0xbf27修改为0xbf5c27,还是没将单引号转义;