php中is_numeric函数的安全漏洞

很多CMS用到过is_numberic函数,我们先看看这个函数的结构
bool is_numeric (mixed $var)
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。
这个函数本身没有什么问题,但是和mysql结合起来就容易出问题,那是因为is_numeric判断的时候,当碰到16进制数的时候,也会判断成数字,如:

echo is_numeric('0x233333');   # 1

而在mysql中,插入0x开头的16进制数的时候,会自动转成字符插入:
例如:

$s = is_numeric($_GET['s'])?$_GET['s']:0;
$sql="insert into test(type)values($s);";
mysql_query($sql);

代码的本意是想过滤掉字符输入,而当输入的时候,用户恶意地以16进制格式输入时,就容易绕过检查,插入恶意代码,进而可能会导致SQL注入的发生。
因此,要避免这样的漏洞发生,可以考虑采用正则表达式的方法来取代is_numberic函数。

你可能感兴趣的:(php中is_numeric函数的安全漏洞)