ADODB是如何完成符号转义的

前端之家收集整理的这篇文章主要介绍了ADODB是如何完成符号转义的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

今天在研究PHP+MysqLsql注入攻击, 发现许多攻击 都是从 单引号(')开始的,

即:如果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() 。

猜你在找的Postgre SQL相关文章