以前一直是在PHP与MySQL环境下开发的,对于PHP+MySQL注入还是比较了解
一般会采用以下两个方法中任意一个来防范SQl Injection(不要两个方法同时用)
方法一:将php.ini文件里的magic_quotes_gpc设成了on
方法二:使用php的addslashes()函数来解决问题
通过上面的方法,就可以将 ' (单引号)," (双引号), \ (反斜杠) 和 空字符等特殊字符自动转为含有反斜杠的转义字符。例如把 ' 变成了\',把\变成了\。这样就可以成为MySQL数据库可以接受的字符。
但如果是Oracle数据库情况又是怎么样呢?
在Oracle数据库中' (单引号),也被认为是特殊字符。但是Oracle中却要把' (单引号)转成''(两个单引号)。
这也就是说 ' (单引号)," (双引号),\ (反斜杠) 等特殊字符在MySQL与Oracle的SQL语句中是完全不一样的。
从下面我们可以看出,我们输入的变量、采用的方法与MySQL与Oracle SQL语句需要的之间的差别
| 输入变量 | 方法一 | 方法二 | 方法一+方法二 | MySQL SQL语句需要的 | Oracle SQL语句需要的 |
| '(单引号) | \' | \' | \' | \' | ''(两个单引号) |
| "(双引号) | \" | \" | \" | \" | " |
| \ (反斜杠) | \ | \ | \ | \ | \ |
在这里介绍一种通用的处理PHP SQL Injection的方法
在PHP6中,magic_quotes_gpc将被移除,系统不会默任将接受到的参数转义。
而且addslashes()函数转义过的特殊字符却并不符合Oracle的SQL语句的要求。
在这种情况下,PEAR类库 MDB2 中的 escape() 方法会是一个不错的选择。
escape()方法可以根据数据库类型的不同,将特殊字符转成各种数据库适合的字符。
详细的使用方法,请查看 http://pear.php.net/


