thinkphp有关魔术字符转义的bug

服务器在开启magic_quotes_gpc的情况下,thinkphp不会去判断服务器的环境,还是会继续转义,于是含有单引号反杠等字符串插库后就被两次转义,每编辑一次就多一倍的转义。

本以为在db类里找到escapeString,加上判断就可以解决问题了,实际上并没有那么简单,就算把db类的转义函数escapeString改成不转义,还是会两次转义,不知道哪里还有转义代码,麻烦死了,后来查了一下,可以在入口文件那里做处理,把外部输入数据先去掉转义,反正thinkphp会转义一次,所以去掉转义也没问题,唯一的问题是所有sql都要使用thinkphp封装了,或者使用_get() _post()等方法引用外部输入数据。

入口处理代码如下:

if (get_magic_quotes_gpc()) {
function addslashes_deep($value) {
$value = is_array($value) ?
array_map(‘addslashes_deep’, $value) :
stripslashes($value);
return $value;
}
$_POST = array_map(‘addslashes_deep’, $_POST);
$_GET = array_map(‘addslashes_deep’, $_GET);
$_COOKIE = array_map(‘addslashes_deep’, $_COOKIE);
$_REQUEST = array_map(‘addslashes_deep’, $_REQUEST);
}

上面方法使用不当会有漏洞,更好的办法是直接修改thinkphp/lib/driver/db/下面的db类

public function escapeString($str) {
if (get_magic_quotes_gpc())
$str = stripslashes($str);
if($this->_linkID) {
return mysql_real_escape_string($str,$this->_linkID);
}else{
return mysql_escape_string($str);
}
}

发表评论