[PHP安全特性学习]is_numeric()函数安全漏洞

简介

 PHP函数的安全特性-is_numerice() 函数

简介

PHP is_numeric() 函数

is_numeric() 函数用于检测变量是否为数字或数字字符串。

语法:

bool is_numeric ( mixed $var )

$var:要检测的变量。

返回值:

  如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。

函数正常使用测试代码:

<?php
$var_name1=678;
$var_name2="a678";
$var_name3="678";
$var_name4="runoob.com";
$var_name5=698.99;
$var_name6=array("a1","a2");
$var_name7=+125689.66;
if (is_numeric($var_name1))
{
    echo "$var_name1 是数字" . PHP_EOL;
}
else
{
    echo "$var_name1 不是数字" . PHP_EOL ;
}
if (is_numeric($var_name2))
{
    echo "$var_name2 是数字" . PHP_EOL ;
}
else
{
    echo "$var_name2 不是数字" . PHP_EOL ;
}
 
$result=is_numeric($var_name3);
echo "[ $var_name3 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name4);
echo "[ $var_name4 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name5);
echo "[ $var_name5 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name6);
echo "[ $var_name6 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name7);
echo "[ $var_name7 是数字吗? ]" .var_dump($result);
?>
View Code

返回结果:

678 是数字
a678 不是数字
bool(true)
[ 678 是数字吗? ]
bool(false)
[ runoob.com 是数字吗? ]
bool(true)
[ 698.99 是数字吗? ]
bool(false)
[ Array 是数字吗? ]
bool(true)
[ 125689.66 是数字吗? ]
View Code

这个函数和mysql结合起来就容易出问题,那是因为is_numeric判断的时候,当碰到16进制数的时候,也会判断成数字

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

函数漏洞测试代码:

<?php
echo '传入:admin:'.is_numeric('admin');
echo '<hr>';
echo '传入十六进制后的admin:'.is_numeric('0x61646D696E'); //十六进制转化的admin
?>

%00绕过 其他的也能绕过例如在1后面加a 成为1a 之类的

原文地址:https://www.cnblogs.com/xhds/p/12312223.html