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 好用的内置函数

PHP 内置函数复杂度(isAnagramOfPalindrome 函数)

PHP内置函数大全

PHP & MySQL数据库专题 第六课 MySQL 内置函数

PHP & MySQL数据库专题 第六课 MySQL 内置函数

内置 PHP 函数的 Netbeans 代码高亮显示