资讯专栏INFORMATION COLUMN

PHP 中的 == 和“隐式转换”

tuniutech / 2983人阅读

摘要:在比较两个字符串,无论它们是否相等,函数的时间消耗是恒定的,可以用来防止时序攻击。

引言

最近,在 Hacker News 上有一篇帖子(https://news.ycombinator.com/item?id=9484757),提到了一种探测网站密码加密方式的方法。



结果都是:

bool(true)
bool(true)
bool(true)

如果在一个网站,使用240610708作为密码,然后用QNKCDZO登陆,结果可以登录的话,说明密码是以MD5方式保存的。类似的,如果用aaroZmOk作为密码,然后用aaK1STfY登陆,结果可以登录的话,说明密码是以sha1方式保存的。第三种当然就是明文存储了。

分析

以第一组数为例:

md5("240610708") 的结果是:0e462097431906509019562988736854
md5("QNKCDZO") 的结果是:0e830400451993494058024219903391

由于 PHP 是弱类型语言,在使用 == 号时,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。上述例子中的两个字符串恰好以 0e 的科学记数法开头,字符串被隐式转换为浮点数,实际上也就等效于 0×10^0 ,因此比较起来是相等的。

类似


第一个返回的是 true,第二个返回的是 false

结论

PHP中的Hash校验,应该使用“===”,而不应该使用“==”。另外如果生产环境版本足够高的话(PHP >= 5.6.0),最好使用 hash_equals() 函数。

hash_equals() 在比较两个字符串,无论它们是否相等,函数的时间消耗是恒定的,可以用来防止时序攻击。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30246.html

相关文章

  • 后端知识点总结——PHP

    摘要:后端知识点总结服务器服务器的作用接收客户端的请求,查找需要的数据文件数据库其它系统,发送回客户端。注意默认情况下,若判定了某个相等条件则执行该条件以及后续所有条件中的执行语句必须配合关键字使用。 后端知识点总结——PHP 1.Web服务器 Web服务器的作用:接收客户端(PC/PAD/PHONE)的请求,查找需要的数据(文件/数据库/其它系统),发送回客户端。 Web服务器分为两种:...

    Astrian 评论0 收藏0
  • 后端知识点总结——PHP

    摘要:后端知识点总结服务器服务器的作用接收客户端的请求,查找需要的数据文件数据库其它系统,发送回客户端。注意默认情况下,若判定了某个相等条件则执行该条件以及后续所有条件中的执行语句必须配合关键字使用。 后端知识点总结——PHP 1.Web服务器 Web服务器的作用:接收客户端(PC/PAD/PHONE)的请求,查找需要的数据(文件/数据库/其它系统),发送回客户端。 Web服务器分为两种:...

    Allen 评论0 收藏0
  • 解析JavaScript判断两个值相等的方法

      本篇文章主要是讲述在JavaScript中判断两个值相等,不要认为很简单,要注意的是在JavaScript中存在4种不同的相等逻辑。  ECMAScript 是 JavaScript 的语言规范,在ECMAScript 规范中存在四种相等算法,如下图所示:  上图中每个依次写下来,很多前端应该熟悉严格相等和非严格相等,但对于同值零和同值却不熟悉,现在就依次下面四种方法。  同值  同值零  非...

    3403771864 评论0 收藏0
  • JavaScript 中的隐式类型转换

    摘要:虽然你可能很惊讶甚至可能怀疑是的但是这都是有语言自己的一个隐式类型转换的套路。基本的隐式类型转换基本类型的隐式转换这个其实我们使用的最多例如结果返回的是而不是这就是类型的隐式转换。 基本上所有的语言都有 隐式类型转换 ,但是对于 弱类型语言(JS) 来说 ,隐式类型转换会比 强类型语言(Java) 带来更大的副作用,有些行为甚至是不可思议的。虽然你可能很惊讶 ,甚至可能怀疑是 JS 的...

    txgcwm 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<