zoukankan      html  css  js  c++  java
  • 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和''结果均为真的问题在于对数据类型的判断,==没有进行数据类型判断,而!==做了数据类型判断。
    使用比较运算符时注意==和===,!=和!==。

  • 相关阅读:
    20180925-5代码规范
    20180925-4 单元测试,结对
    20180925-6 四则运算试题生成
    20180925-3 效能分析
    20170925-2 功能测试
    20180925-7 规格说明书——吉林市两日游
    20180918-1 词频统计
    第二周例行报告
    iOS开发-CocoaPods使用详细说明
    svn的使用详解
  • 原文地址:https://www.cnblogs.com/a-qi/p/14695736.html
Copyright © 2011-2022 走看看