今天在研究PHP+MysqL的 sql注入攻击, 发现许多攻击 都是从 单引号(')开始的,
即:如果PHP.ini中 magic_quotes_gpc = off,输入内容中有 单引号(') 就可以实现关闭,从而得以注入。
但是试了一下,发现及时 magic_quotes_gpc = off,sql文中输入的引号前还有一个引号,就是两个引号(''),注入也没有成功。
因为我实验的时候试的是Postgres ,一开始以为是这个原因,但是很快就排除了。
后来想到了我的程序中,数据库访问都用到了ADODB,且所有的数据库访问都继承自两个通用的类,一个是管查询,一个是管动作操作(追加,更改,删除)。 于是想到是不是 ADODB 有办法来完成单引号(')转义的呢?
刚才查了下资料,看到一个老外也有这样类似的疑惑,有人回答了他,于是知道原来 ADODB 中 ADOConnection 公用函数 有个 qstr 方法 ,这个方法能够完成转义,我又查看了ADODB的手册(来自:http://www.souzz.net/online/adobd.html#qstr
)如下:
qstr($s,[$magic_quotes_enabled=false])
将一个字串放在引号内,以送到资料库中。$magic_quotes_enabled 叁数可能看起来很有趣,但这个想法是假设你已经用一个引号来处理了从 POST/GET 变数取来的字串後,然後以 get_magic_quotes_gpc() 做为第二个叁数。这会确定这个变数不会被引号处理二次,一次被 qstr 处理,一次被 magic_quotes_gqc。
例如: $s = $db->qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());
回传值是一个被引号处理过的字串。
上面的手册说明语句有点拗口哦,但是知道了“回传值是一个被引号处理过的字串”也就够了。
这下解决了我的疑问,原来ADODB 是靠qstr 结合 magic_quotes_gpc 来转义单引号的,
我想我的项目中用来被继承的那两个通用的类里一定有关于qstr 的语句,周一上班一定再去确认一下。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
周一来确认了一下代码, 结果发现通用的类里并没有使用 qstr 来转义 单引号('),而是用了 pg_escape_string 。
语句如: $tmpvalue_nest = pg_escape_string($tmpvalue_nest);
因为我们的数据库是postgres ,所以日本人用了这个 postgres 的PHP函数一样完成了转义,即在原来的 单引号(')前,再加一个单引号,变成两个单引号的形式来对数据库操作。
有没有办法设置其他的符号如:反斜杆(slash /)加在原来的单引号(')前,我还没有研究过,感觉应该可以,postgres应该会提供类似的PHP函数。
pg_escape_string 详解如下:
pg_escape_string
(PHP 4 >= 4.2.0,PHP 5)
pg_escape_string -- 转义 text/char 类型的字符串
说明
string pg_escape_string ( string data )
pg_escape_string() 转义 text/char 数据类型的字符串,返回转义后的字符串。建议用此函数替代 addslashes() 。
注: 本函数需要 Postgresql 7.2 或以上版本。
参见 pg_escape_bytea() 。