好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php intval() 小数时安全漏洞分析 - php高级应用

php intval() 小数时安全漏洞分析

本文章先来介绍了php intval简单用法,它可以把字符,数字,小数转换灰数字型数据,但在转换时会出现一些问题如小数1.1就会转换成1,下面看实例.

一、变量转成整数类型.

语法:int intval(mixed var, int [base]);

返回值:整数

函数种类:PHP 系统功能

内容说明:本函数可将变量转成整数类型,可省略的参数 base 是转换的基底,默认值为 10,转换的变量 var 可以为数组或类之外的任何类型变量.

intval()使用不当的安全漏洞分析

intval函数有个特性:]直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时()结束转换],在某些应用程序里由于对intval函数这个特性认识不够,错误的使用导致绕过一些安全判断导致安全漏洞.

二、分析,代码如下:

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);    }    Zend/zend_operators.c->>convert_to_long_base()    ……    case   IS_STRING :    strval  = Z_STRVAL_P(op);    Z_LVAL_P(op) = strtol( strval , NULL, base);  //开源代码phpfensi.com   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范围从2至36,或0.参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等.

流程为:strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时()结束转换,并将结果返回.

 

那么当intval用在if等的判断里面,将会导致这个判断实去意义,从而导致安全漏洞.

三、测试代码,代码如下:

<?php  $o  = 0.1;  for ( $a  = 1;  $a  < 100;  $a ++){  $o  += 0.1;  echo  [<br /> intval ( $o ) = [. intval ( $o );  if ( intval ( $o )){  print([&nbsp;true]);  } else {  print([&nbsp;false]);  }  }?>  /*   输出结果:   intval(0.2) = 0 false   intval(0.3) = 0 false   intval(0.4) = 0 false   intval(0.5) = 0 false   intval(0.6) = 0 false   intval(0.7) = 0 false   intval(0.8) = 0 false   intval(0.9) = 0 false   intval(1) = 0 false   intval(1.1) = 1 true   intval(1.2) = 1 true   intval(1.3) = 1 true   intval(1.4) = 1 true   intval(1.5) = 1 true   intval(1.6) = 1 true   intval(1.7) = 1 true   intval(1.8) = 1 true   intval(1.9) = 1 true   intval(2) = 2 true   …..   */  

php intval 与 int 的区别,代码如下:

$t  = '165' ;    echo   gettype ((int)( $t ));  echo   '<hr>' ;  echo   gettype ( intval ( $t ));    //输出结果:integer integer value:165       $t  = 'a165' ;    echo   gettype ((int)( $t ));  echo   '<hr>' ;  echo   gettype ( intval ( $t ));    //结果 integer integer value:0,0     $string = "2a" ;   $string1 = intval ( $string );   echo   '$string1的值:' . $string1 . '$string2的值:' ; //单引号不会输出变量,将原样输出    $string2 =(int)( $string );   echo   $string2  

查看更多关于php intval() 小数时安全漏洞分析 - php高级应用的详细内容...

  阅读:39次