变量转成整数类型 语法 int intval(mixed var int [base])
返回值 整数
函数种类 PHP 系统功能
内容说明
本函数可将变量转成整数类型可省略的参数 base 是转换的基底默认值为 转换的变量 var 可以为数组或类之外的任何类型变量
intval()使用不当的安全漏洞分析
intval函数有个特性直到遇上数字或正负符号才开始做转换再遇到非数字或字符串结束时()结束转换在某些应用程序里由于对intval函数这个特性认识不够错误的使用导致绕过一些安全判断导致安全漏洞
二分析
代码如下 复制代码
PHP_FUNCTION(intval)
{
zval **num **arg_base;
int base;
switch (ZEND_NUM_ARGS()) {
case :
if (zend_get_parameters_ex( &num) == FAILURE) {
WRONG_PARAM_COUNT;
}
base = ;
break;
case :
if (zend_get_parameters_ex( &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 )
convert_to_long_base(return_value base)
}
Zend/zend_operatorsc》convert_to_long_base()
……
case IS_STRING:
strval = Z_STRVAL_P(op)
Z_LVAL_P(op) = strtol(strval NULL base)
STR_FREE(strval)
break;
当intval函数接受到字符串型参数是调用convert_to_long_base()处理接下来调用Z_LVAL_P(op) = strtol(strval NULL base)通过strtol函数来处理参数
函数原型如下
long int strtol(const char *nptrchar **endptrint base)
这个函数会将参数nptr字符串根据参数base来转换成长整型数参数base范围从至或参数base代表采用的进制方式如base值为则采用进制若base值为则采用进制等
流程为
strtol()会扫描参数nptr字符串跳过前面的空格字符直到遇上数字或正负符号才开始做转换再遇到非数字或字符串结束时()结束转换并将结果返回
那么当intval用在if等的判断里面将会导致这个判断实去意义从而导致安全漏洞
三测试代码
代码如下 复制代码
<?php
$o = ;
for($a = ; $a < ; $a++){
$o += ;
echo <br />intval($o) = intval($o)
if(intval($o)){
print( true)
}else{
print( false)
}
}?>
输出结果
intval() = false
intval() = false
intval() = false
intval() = false
intval() = false
intval() = false
intval() = false
intval() = false
intval() = false
intval() = true
intval() = true
intval() = true
intval() = true
intval() = true
intval() = true
intval() = true
intval() = true
intval() = true
intval() = true
……
php intval 与 int 的区别
代码如下 复制代码
$t =;
echo gettype((int)($t))
echo <hr>;
echo gettype(intval($t))
//输出结果integer integer value:
$t =a;
echo gettype((int)($t))
echo <hr>;
echo gettype(intval($t))
//结果 integer integer value:
$string=a;
$string=intval($string)
echo $string的值$string$string的值;//单引号不会输出变量将原样输出
$string=(int)($string)
echo $string