yjxing

PHP中“==”的一些坑

PHP 是弱类型的语言,会自动进行数据类型转换,这无疑给我们的开发带来了极大的方便。可事实真是如此吗?今天我们就从==说起。

栗子

首先,看一下这段代码。猜猜看结果会是什么

<?php
var_dump(md5(\'240610708\') == md5(\'QNKCDZO\'));
var_dump(md5(\'aabg7XSs\') == md5(\'aabC9RqS\'));
var_dump(sha1(\'aaroZmOk\') == sha1(\'aaK1STfY\'));
var_dump(sha1(\'aaO8zKZF\') == sha1(\'aa3OFF9m\'));
var_dump(\'0010e2\' == \'1e3\');
var_dump(\'0x1234Ab\' == \'1193131\');
var_dump(\'0xABCdef\' == \' 0xABCdef\');

var_dump(0 == \'abcdefg\');
var_dump(1 == \'1abcdef\');
?>

一眼看过,很明显肯定都是false吧,但运行代码后发现全是true

WTF!

为什么会这样

开头我已经说过了,PHP 是弱类型的语言。使用==对比两个变量时,当有一个变量为整数,另外一个变量也会转换为整数。这也就解释了,为什么0 == \'abcdefg\'1 == \'1abcdef\'会成立。

但是,其他的代码呢?字符串难道还会转换?

PHP 手册上为我们提供了解释说明。

If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

也就是说,如果你比较的两个字符串涉及到数字(如:"0"),那么每个字符串都会转换成数字。

在这里,我不得不说:PHP是最好的语言!

危害

当我们的网站是直接MD5Sha1加密而没有加盐,碰巧某用户密码加密涉及到数字,那么就有可能被碰撞破解!

解决

  1. 在开发过程中尽可能避免使用==判断两个变量的值
  2. 密码加密最好使用password_hash()或者加盐md5($pwd.$salt)

分类:

技术点:

相关文章: