php内置函数intval()
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php内置函数intval()相关的知识,希望对你有一定的参考价值。
参考技术A 一 描述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_operators c >>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 *nptr char **endptr int base);这个函数会将参数nptr字符串根据参数base来转换成长整型数 参数base范围从 至 或 参数base代表采用的进制方式 如base值为 则采用 进制 若base值为 则采用 进制等
流程为
strtol()会扫描参数nptr字符串 跳过前面的空格字符 直到遇上数字或正负符号才开始做转换 再遇到非数字或字符串结束时(/ )结束转换 并将结果返回
那么当intval用在if等的判断里面 将会导致这个判断实去意义 从而导致安全漏洞
三 测试代码
//intval php
$var= ;
if (intval($var))
echo it s safe ;
echo $var= $var;
echo
;
$var = union select from admin ;
if (intval($var ))
echo it s safe too ;
echo $var = $var ;
WordPress <= wp trackback php Zend_Hash_Del_Key_Or_Index / sql injection exploit lishixinzhi/Article/program/PHP/201311/20990
PHP 秒数 转时分秒 函数
function secondsToHour($seconds){ if(intval($seconds) < 60) $tt ="00时00分".sprintf("%02d",intval($seconds%60)); if(intval($seconds) >=60){ $h =sprintf("%02d",intval($seconds/60)); $s =sprintf("%02d",intval($seconds%60)); if($s == 60){ $s = sprintf("%02d",0); ++$h; } $t = "00"; if($h == 60){ $h = sprintf("%02d",0); ++$t; } if($t){ $t = sprintf("%02d",$t); } $tt= $t."时".$h."分".$s.‘秒‘; } if(intval($seconds)>=60*60){ $t= sprintf("%02d",intval($seconds/3600)); $h =sprintf("%02d",intval($seconds/60)-$t*60); $s =sprintf("%02d",intval($seconds%60)); if($s == 60){ $s = sprintf("%02d",0); ++$h; } if($h == 60){ $h = sprintf("%02d",0); ++$t; } if($t){ $t = sprintf("%02d",$t); } $tt= $t."时".$h."分".$s.‘秒‘; } return $seconds>0?$tt:‘00时00分00秒‘; }
以上是关于php内置函数intval()的主要内容,如果未能解决你的问题,请参考以下文章
PHP 内置函数复杂度(isAnagramOfPalindrome 函数)
PHP & MySQL数据库专题 第六课 MySQL 内置函数