一篇文章带你搞定PHP中的is_numeric()函数

在 PHP 中,is_numeric 函数用于检查一个变量是否是数字或数字字符串。这个函数的语法如下:

is_numeric($variable)

其中,$variable 是要检查的变量。

is_numeric 函数返回一个布尔值,如果变量是数字或数字字符串,则返回 true,否则返回 false

以下是使用 is_numeric 函数的示例:

$num = 123;

$str_num = "456";

$not_num = "ABC";

var_dump(is_numeric($num)); // 输出:bool(true)

var_dump(is_numeric($str_num)); // 输出:bool(true)

var_dump(is_numeric($not_num)); // 输出:bool(false)

在上述示例中,is_numeric 函数分别检查了一个整数、一个数字字符串和一个非数字字符串。只有前两个变量被认为是数字或数字字符串,而最后一个变量被认为不是数字。

注意,is_numeric 函数只能判断变量是否是数字或数字字符串,它不能确保变量具体是哪种类型的数字(如整数、浮点数等)。

既然讲了这个函数,那就必须得学会绕过他!

这里先给普及点常识:

1.在 URL 中,空格通常被编码为 %20

2.在 URL 编码中,%00 表示空字符(null character),也称为 NULL 终止符。它是一个二进制值,用于指示字符串的结尾。

绕过方法:

?a=1%20

?a=%001

?a=1%00

这三种方式都可以使得原本应该输出的true变成false

最后的最后,很遗憾提醒一下大家,大多数的漏洞都是会被修复的,这个绕过只能在php7及以前可以(其实也足够了),php8就被修复了,如下:

 带有空格的 is_numeric()

<?php
$tests = [
" 42",
"42 ",
"\u{A0}9001", // non-breaking space
"9001\u{A0}", // non-breaking space
];
foreach ($tests as $element) {
if (is_numeric($element)) {
echo var_export($element, true) . " is numeric", PHP_EOL;
} else {
echo var_export($element, true) . " is NOT numeric", PHP_EOL;
}
}
?>

以上示例在 PHP 8 中的输出:

' 42' is numeric
'42 ' is numeric
' 9001' is NOT numeric
'9001 ' is NOT numeric

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值