php通过==和!==比较NULL和''结果均为真

0x01 前言

在做一道md5()的CTF题目时,代码如下:

  include_once "flag.php";
  ini_set("display_errors", 0);
  $str = strstr($_SERVER['REQUEST_URI'], '?');
  $str = substr($str,1);
  $str = str_replace('key','',$str);
  parse_str($str);
  echo md5($key1);

  echo md5($key2);
  if(md5($key1) == md5($key2) && $key1 !== $key2){
      echo $flag."取得flag";
  }

提交参数“?kkeyey1=”即可得到flag,对此感到疑惑,便进行了简单测试。

0x02 PHP比较运算符


==只对值做判断,比如5=="5"结果为真;===绝对等于,会判断数据类型和值,5==="5"结果为假;!==绝对不等于也会判断数据类型。

0x03

提交的参数最后被处理为key1='',key2为NULL。
''和NULL使用md5()进行加密后的MD5值是相同的,都是“d41d8cd98f00b204e9800998ecf8427e”

因此MD5值比较验证通过。
题目代码中使用了绝对不等于(!==)对key1和key2的原始值进行判断,''的类型为String,NULL的类型为NULL所以 ''!==NULL 的结果为真。

0x04 总结

关于通过==和!==比较NULL和''结果均为真的问题在于对数据类型的判断,==没有进行数据类型判断,而!==做了数据类型判断。
使用比较运算符时注意==和===,!=和!==。

原文地址:https://www.cnblogs.com/a-qi/p/14695736.html