考虑这段代码
<?
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注入攻击。这是否算作错误?
答案 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是一种非常古老的语言,许多设计都失败了。