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函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章