2010-12-09 29 views
7

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

一个不明确的例子是:

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

数据类型在MySQL是INT()。

+1

是$ _GET ['user_id']还是$ _POST ['user_id']? – 2010-12-09 09:45:00

+0

就是这样的例子:)把它们都更改为$ _GET – Dunhamzzz 2010-12-09 09:53:45

+6

**不要将数据验证和数据清理混合在一起!** if(is_numeric(是数据验证。**可以在将来更改**。虽然清理规则会准备好的陈述的唯一好处在于同样的理由:如果你需要清理一个变量,它不会*认为*。**它可以。**时期。所以,要聪明,学会从这个良好的实践中,根据需要验证您的输入,但无条件地清理数据库变量 – 2010-12-09 10:04:39

回答

8

在我看来,最安全的方法是将USER_ID转换为整数,如果无效则返回0。

$user_id = (int) $_GET['user_id']; 

if ($user_id > 0) { 
    mysql_query("SELECT * FROM `users` WHERE `id` = " . $user_id); 
} 
4

http://php.net/manual/en/function.is-numeric.php

使用is_numeric时要小心()转义SQL字符串。 is_numeric('0123')返回true,但不带引号的0123不能插入到SQL中。 PHP将不带引号的0123解释为字面八进制数;但SQL只会引发语法错误。

4

考虑到“10e3”is_numeric,没有。

如果你想的数字(如,只有数字),你必须检查ctype_digit(这将仍然打破像0123数字SQL)或铸造数量增加到intfloat。如果数字可以接受为以外的所有数字,则需要应用SQL安全转义和引用。

-1

因为PROGRAMM必须不存在id准备好变种这种单排要足够:

mysql_query(sprintf("SELECT * FROM `users` WHERE `id` = %d LIMIT 1",$_GET['user_id'])); 

不管什么不会是我们通过sprintf内的十进制数将转向小数。零(〜坏输入)具有与没有现有ID相同的状态。

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