is_numeric()是否意味着var对MySQL是安全的?

时间:2010-12-09 09:42:09

标签: php mysql sql-injection

问题说这一切都有希望,如果我检查一个变量为is_numeric()返回true,是否可以直接放入MySQL查询,或者我是否需要应用标准转义?我在想零字符,溢出漏洞和东西。

一个含糊不清的例子是:

if(is_numeric($_GET['user_id'])) {
    mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']);
}

MySQL中的数据类型是INT()。

4 个答案:

答案 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或者将号码转换为intfloat。如果数字可以接受所有数字以外的其他数字,则需要应用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相同的状态。

保存条件并声明额外变量。