在GWA2的核心处理DB连接及查询处理时,会对用户的输入做安全性过滤,
如在 inc/dba.class.php中对用户输入进行封装,并将结果交给指定的inc/mysql.class.php去处理。
在inc/mysql.class.php中,会将用户的输入去除转义字符,在非数字的字符串上加上引号。其判断逻辑是:
if(!is_numeric($value)){
$value = “‘”.mysql_real_escape_string($value,$this->m_link).”‘”;
}
通常这样做是没有问题的,但如果想在数据表中存入数字型字符串,比如在一个应用中的目录代码是 01010003 , 在使用 is_numeric时,返回的就会是true:
is_numeric(‘1010003’); # true
is_numeric(‘010100003’); # true
遇到这种情况,就不能使用GWA2的安全套件,如$obj->setBy, $obj->getBy等,但可以使用$obj->execBy, 这个方法允许用户自行组装SQL语句,从而避开原有的检查程序的缺陷。
在 -gMIS 中找到一种实现方法, -R/z2TO
想来想去,还是这个法子好。
不然,无论是采取多增加配置文件,或者读取表属性的方法来判断某个字段是否有 number as string的需求,都有点一个人(字段)有病,所有人(字段)吃药的感觉。