详解PHP intval()函数的实例用法

 更新时间:2023年07月27日 11:54:21   作者:士别三日wyx  
本篇文章主要给大家介绍php intval函数怎么用,那么intval()函数是PHP中的内置函数,它返回变量的整数值,文中通过代码详细介绍了PHP intval()函数的用法,需要的朋友可以参考下

intval() 函数可以获取变量的「整数值」。常用于强制类型转换。

语法

int intval( $var, $base )

参数

  • $var:需要转换成 integer 的「变量」
  • $base:转换所使用的「进制」

返回值

返回值为 integer 类型,可能是 0 或 1 或 其他integer 值。

  • 0:失败 或 空array 返回 0
  • 1:非空array 返回 1
  • 其他integer值:成功时 返回 $var 的 integer 值。

返回值的「最大值」取决于系统

  • 32 位系统(-2147483648 到 2147483647)
  • 64 位系统(-9223372036854775808到9223372036854775807)

一、进制自动转换

第二个参数 $base 允许为空。

当 base 为空时,默认值是 0,会根据 $var 的格式来调整转换的进制。

  • 如果 $var 以 0 开头,就使用 8进制
  • 如果 $var 以0x开头,就使用 16进制
  • 否则,就使用 10进制

实例:

# 10的 8进制是12
var_dump(intval(012));
# 10的 16进制是A
var_dump(intval(0xA));
# 10的 10进制是10
var_dump(intval(10));

输出:

int(10)
int(10)
int(10)

绕过思路:当某个数字被过滤时,可以使用它的 8进制/16进制来绕过。

二、转换数组

intval() 转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。

  • 「空数组」返回 0
  • 「非空数组」返回 1

实例:

var_dump(intval(array()));
var_dump(intval(array(3,2)));

输出:

int(0)
int(1)

如果传入的 $var是数组中的某个值时,则当做变量来转换,而不是当做数组类型。

实例:

$arr1 = array(8,6);
var_dump(intval($arr1[0]));

输出:

int(8)

绕过思路:对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。

三、转换小数

intval() 转换小数类型时,只返回个位数,不遵循四舍五入的原则。

实例:

var_dump(intval(12));
var_dump(intval(1.2));
var_dump(intval(1.9));

输出:

int(12)
int(1)
int(1)

绕过思路:当某个数字被过滤时,可以给它增加小数位来绕过。

四、转换字符串

intval() 转换字符串类型时,会判断字符串是否以数字开头

  • 如果以数字开头,就返回1个或多个连续的数字
  • 如果以字母开头,就返回0

单双引号对转换结果没有影响,并且 0 或 0x 开头也只会当做普通字符串处理。

实例:

var_dump(intval('12abc'));
var_dump(intval("12abc"));
var_dump(intval('abc123'));
var_dump(intval('1a2b3c'));
var_dump(intval('0101'));
var_dump(intval("0x2b"));

输出:

int(12)
int(12)
int(0)
int(1)
int(101)
int(0)

五、取反~

intval() 函数支持一些特殊符号的,比如~取反。

实例:

var_dump(intval(~10));
var_dump(intval(~~10));

输出:

int(-11)
int(10)

绕过思路:当某个数字被过滤时,可以两次取反来绕过。

六、算数运算符

intval() 函数支持算数运算符,如果传入的 $var参数包含算数运算符,会先运算,再对运算结果进行转换。

实例:

var_dump(intval(5*5));
var_dump(intval(5+5));
var_dump(intval(05+5));

输出:

int(25)
int(10)
int(10)

绕过思路:当某个数字被过滤时,可以使用算数运算符绕过。

七、浮点数精度缺失问题

由于PHP中的浮点数是「弱类型」,存在「精度丢失」的问题,在转换时可能会出现意料之外的情况。

比如下面这个案例,第一个输出34正常,第二个以为会输出58,结果输出了57。

实例:

var_dump(intval(0.34*100.0));
var_dump(intval(0.58*100.0));

输出:

int(34)
int(57)

八、intval()绕过思路

最后汇总一下intval()函数漏洞的绕过思路:

1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)
5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。

以上就是详解PHP intval()函数的实例用法的详细内容,更多关于PHP intval()函数的资料请关注脚本之家其它相关文章!

相关文章

  • php 全文搜索和替换的实现代码

    php 全文搜索和替换的实现代码

    方便替换和全文索引
    2008-07-07
  • 利用php输出不同的心形图案

    利用php输出不同的心形图案

    这篇文章主要介绍了利用php输出不同的心形图案,用php输出心形曲线、再利用php输出笛卡尔心形图案,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • php cout<<的一点看法

    php cout<<的一点看法

    cout<<运算符后面如果是常整数,那么最大可以输出4294967295,即2^32-1,不允许出现负数,也就是说,cout<<运算符对于常整数只重载了unsigned int型;对于有小数的情况,则保留6位有效数字.
    2010-01-01
  • php中全局变量global的使用演示代码

    php中全局变量global的使用演示代码

    用php编程的人对流程这个名词很熟悉。一般做php的工程师对面向对象的理解不是太深,所以在大流程中的方法中需要调用到外面变量,所以用的全局变量的机会会很多
    2011-05-05
  • PHP编程过程中需要了解的this,self,parent的区别

    PHP编程过程中需要了解的this,self,parent的区别

    this是指向对象实例的一个指针,在实例化的时候来确定指向;self是对类本身的一个引用,一般用来指向类中的静态变量;parent是对父类的引用,一般使用parent来调用父类的构造函数。
    2009-12-12
  • php之字符串变相相减的代码

    php之字符串变相相减的代码

    php之字符串变相相减的代码...
    2007-03-03
  • PHP与Perl之间知识点区别整理

    PHP与Perl之间知识点区别整理

    在本篇文章里小编给大家分享了关于PHP与Perl的却别以及相关知识点整理,有兴趣的朋友们学习下。
    2019-03-03
  • php遍历类中包含的所有元素的方法

    php遍历类中包含的所有元素的方法

    这篇文章主要介绍了php遍历类中包含的所有元素的方法,涉及php中getConstants方法及数组操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • PHP简单装饰器模式实现与用法示例

    PHP简单装饰器模式实现与用法示例

    这篇文章主要介绍了PHP简单装饰器模式实现与用法,结合具体实例形式分析了php装饰器模式的原理、实现与使用方法,需要的朋友可以参考下
    2017-06-06
  • PHP生成唯一订单号

    PHP生成唯一订单号

    这篇文章主要给大家介绍了一位网友PHP生成唯一订单号的思路和示例,感觉非常不错,需要的朋友可以参考下
    2015-07-07

最新评论