问题说这一切都有希望,如果我检查一个变量为is_numeric()返回true,是否可以直接放入MySQL查询,或者我是否需要应用标准转义?我在想零字符,溢出漏洞和东西。
一个含糊不清的例子是:
if(is_numeric($_GET['user_id'])) {
mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']);
}
MySQL中的数据类型是INT()。
答案 0 :(得分:8)
我认为最安全的方法是将user_id转换为整数,如果它无效,则返回0。
$user_id = (int) $_GET['user_id'];
if ($user_id > 0) {
mysql_query("SELECT * FROM `users` WHERE `id` = " . $user_id);
}
答案 1 :(得分:5)
考虑“10e3”is_numeric
,不。
如果你想要数字(例如,只有数字),你必须检查ctype_digit
(对于像0123
这样的数字仍然会破坏SQL或者将号码转换为int
或float
。如果数字可以接受所有数字以外的其他数字,则需要应用SQL安全转义和引用。
答案 2 :(得分:4)
来自http://php.net/manual/en/function.is-numeric.php:
使用is_numeric()转义SQL字符串时要小心。 is_numeric('0123')返回true但不带引号的0123无法插入SQL。 PHP将没有引号的0123解释为文字八进制数;但SQL只会引发语法错误。
答案 3 :(得分:-1)
因为程序必须为不存在的id
的变体做好准备,所以这一行应该足够了:
mysql_query(sprintf("SELECT * FROM `users` WHERE `id` = %d LIMIT 1",$_GET['user_id']));
无论我们在sprintf
内传递的十进制数是多少都将变为十进制。零(〜错误输入)具有与没有现有id相同的状态。
保存条件并声明额外变量。