在看80vul的phpcodez系列文章看到的phpintval函数的分析。

php intval函数在处理变量的时候,从前往后指针遇到数字或正负符号才判别到开始做转换,再遇到非数字或字符串结束时(\0)结束转换

下面是函数原型

PHP_FUNCTION(intval)
{
        zval **num, **arg_base;
        int base;
      switch (ZEND_NUM_ARGS()) {
                case 1:
                        if (zend_get_parameters_ex(1, &num) == FAILURE) {
                                WRONG_PARAM_COUNT;
                        }
                        base = 10;
                        break;
                case 2:
                        if (zend_get_parameters_ex(2, &num, &arg_base) == FAILURE) {
                                WRONG_PARAM_COUNT;
                        }
                        convert_to_long_ex(arg_base);
                        base = Z_LVAL_PP(arg_base);
                        break;
                default:
                        WRONG_PARAM_COUNT;
        }
        RETVAL_ZVAL(*num, 1, 0);
        convert_to_long_base(return_value, base);
}

下面是Discuz X3.2(9/2/2016为止)最新版本里一处典型的错误写法。

文件:source/class/table/table_forum_forum.php

public function fetch_all_info_by_ignore_fid($fid) {
if(!intval($fid)) {
    return array();
}
        return DB::fetch_all("SELECT fid, type, name, fup FROM ".DB::table($this->_table)." WHERE ".DB::field('fid', $fid, '<>')." AND type<>'sub' AND status<>'3' ORDER BY displayorder");
    }