php中==与===的使用不慎导致安全问题
作者:admin 日期:2015-08-05
php是一门动态类型的语言,他的变量的类型不需要我们显式的指出,他会自动选择合适的类型。所以在php中有两种相等比较符,==与===。 在使用==进行比较时,将会进行类型转换后的比较。当使用===将会先比较变量的类型,如果类型不一致,会直接被判定为不相等。
由此使用"=="会引入一些安全问题。
1. 数字转换
$user = "1.999999999999999999999999999999999999999999999999";
if ((int)$user == 1) {
$res = mysql_query("select * from test where id = '$user'");
while( ($row = mysql_fetch_assoc($res)) != null) {
var_dump($row);
}
} else {
echo "you are not admin";
}
将会输出:
array(2) {
["id"]=>
string(1) "2"
["username"]=>
string(12) "zeroplace.cn"
}
2. hash值比较
如果一个hash值是0exxxxxxxxxx,且x全部为数字时,php会将它认为是一个数字,如果这个数字与另一个值也为0的数字比较,将会相等。比如
var_dump("00e0345" == "0e33239382");
这个比较表达式将会输出
bool(true)
如果x不全为数字则不存在这个问题。
3. 序列化后,bool值欺骗
$user = unserialize('b:1;');
var_dump($user == "admin");
以上将会输出
bool(true)