在 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