PHP中“==”的一些坑
程序员文章站
2022-03-16 12:29:27
...
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是最好的语言!
危害
当我们的网站是直接MD5或Sha1加密而没有加盐,碰巧某用户密码加密涉及到数字,那么就有可能被碰撞破解!
解决
1.在开发过程中尽可能避免使用==判断两个变量的值
2.密码加密最好使用password_hash()或者加盐md5($pwd.$salt)
更多PHP相关知识,请访问PHP中文网!
以上就是PHP中“==”的一些坑的详细内容,更多请关注其它相关文章!
推荐阅读
-
php中输出中文数组出现奇怪的问题怎么破?
-
php面向对象类中的$this,static,final,const,self及双冒号 : 这几个关键字使用方法
-
解决RHAS3中Apache2的PHP上传文件大小的限制_PHP
-
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题_PHP
-
php中将数组转成字符串并保存到数据库中的函数代码_PHP教程
-
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
-
在php中判断一个请求是ajax请求还是普通请求的方法
-
优化php效率,提高php性能的一些方法
-
php中取得URL的根域名的代码
-
php中的三元运算符使用说明