Home > php教程 > php手册 > body text

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

WBOY
Release: 2016-05-25 16:41:07
Original
2859 people have browsed it

本文章先来介绍了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); 
STR_FREE(strval); 
break;
Copy after login

当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(" true"); 
}else{ 
print(" 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 =&#39;165&#39;; 
echo gettype((int)($t)); 
echo &#39;<hr>&#39;; 
echo gettype(intval($t)); 
//输出结果:integer integer value:165 
$t =&#39;a165&#39;; 
echo gettype((int)($t)); 
echo &#39;<hr>&#39;; 
echo gettype(intval($t)); 
//结果 integer integer value:0,0 
$string="2a";  
$string1=intval($string);  
echo &#39;$string1的值:&#39;.$string1.&#39;$string2的值:&#39;;//单引号不会输出变量,将原样输出  
$string2=(int)($string);  
echo $string2
Copy after login


永久链接:

转载随意!带上文章地址吧。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template