这是否算作php的bug

时间:2014-08-04 02:00:31

标签: php mysql sql-injection

考虑这段代码

<?
if($_GET["inp"]==0 || $_GET["inp"]==1) $inp=$_GET["inp"];
mysql_query("select * from table1 where field1=".$inp);
?>
除非我们使用$_GET["inp"]==0

,否则

和php会返回此语句$_GET["inp"]=="0"

因此,如果有人使用此代码,他可能被sql注入攻击。这是否算作错误?

1 个答案:

答案 0 :(得分:3)

不,这不是错误

$_GET["inp"]==0

应该是

$_GET["inp"]==="0"

===表示您检查数据类型。看看这里:http://php.net/manual/de/language.operators.comparison.php

另请查看pdo(http://php.net/manual/de/book.pdo.php)和准备好的陈述。 (可以使用代码进行SQL注入

  

为什么&#34;一切&#34; == 0都会返回true?是的我知道===但是甚至   ==一定不要追溯真实。 - Mehdi Azizi

来自此处的文档:http://php.net/manual/en/language.operators.comparison.php

  

如果将数字与字符串进行比较,或者比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较数字执行。这些规则也适用于交换机   声明。比较时不会进行类型转换   是===或!==因为这涉及比较类型以及   值。

有了这些信息,我们可以将其转换为:

var_dump(0 == "a"); //true
//a is not a real number, so we use 0
var_dump(0 == 0); //true

我们想要什么:

//Note it is === and not ==
var_dump(0 === "a"); //false

还有兴趣

var_dump("true" == 0); //false
var_dump("true" == 1); //false
var_dump("false" == 0); //false
var_dump("1" == 1); //true
var_dump("1" == 0); //false
var_dump("0" == 0); //true

预防

var_dump(empty("")); //true
var_dump(empty(0)); //true
var_dump(empty(null)); //true
var_dump(empty(false)); //true
var_dump(empty(true));  //false

你想检查&#34;真实&#34;空,您使用($var === '')。 PHP是一种非常古老的语言,许多设计都失败了。