[英]Does is_numeric() mean a var is safe for MySQL?
問題說這一切都有希望,如果我檢查一個變量為is_numeric()返回true,是否可以直接放入MySQL查詢,或者我是否需要應用標准轉義? 我在想零字符,溢出漏洞和東西。
一個模棱兩可的例子是:
if(is_numeric($_GET['user_id'])) {
mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']);
}
MySQL中的數據類型是INT()。
在我看來,最安全的方法是將user_id轉換為整數,如果它是無效的,它將返回0。
$user_id = (int) $_GET['user_id'];
if ($user_id > 0) {
mysql_query("SELECT * FROM `users` WHERE `id` = " . $user_id);
}
考慮到“10E3” is_numeric
,沒有。
如果你想要數字(如在數字中, 只有數字 ),你將需要檢查ctype_digit
(它仍然會破壞像0123
這樣的數字的SQL)或者將數字轉換為int
或float
。 如果數字不是所有數字都可以接受,則需要應用SQL安全轉義和引用。
來自http://php.net/manual/en/function.is-numeric.php :
使用is_numeric()轉義SQL字符串時要小心。 is_numeric('0123')返回true但不帶引號的0123無法插入SQL。 PHP將沒有引號的0123解釋為文字八進制數; 但SQL只會引發語法錯誤。
因為程序必須為不存在的id
變體做好准備,所以這一行應該足夠了:
mysql_query(sprintf("SELECT * FROM `users` WHERE `id` = %d LIMIT 1",$_GET['user_id']));
無論什么都不是十進制數,我們在sprintf
內傳遞將轉為十進制。 零(〜錯誤輸入)具有與沒有現有id相同的狀態。
保存條件並聲明額外變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.