php中==与===的使用不慎导致安全问题

 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)

 



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 6770