簡介
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); ?>
返回結果:

678 是數字 a678 不是數字 bool(true) [ 678 是數字嗎? ] bool(false) [ runoob.com 是數字嗎? ] bool(true) [ 698.99 是數字嗎? ] bool(false) [ Array 是數字嗎? ] bool(true) [ 125689.66 是數字嗎? ]
這個函數和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 之類的