PHP empty()与isset()的比较

一道CTF引起

今天打CTF无意间发现了我原来没怎么注意过的一些问题,特地拿出来记录一下。
一道php代码审计题目如下图:
image

程序员含义是,用get传入参数ac,fn extract()会直接生成一个ac变量,如果不为空再将fn传入的文件名的文件的内容作为字符串并且去除两边的空格返回给$f,当ac传入的变量和f传入的文件内容完全相等的时候(注意)这里是完全相等,就会返回flag.
本题已经知道目录下有一个flag.txt文件内容是flags
所以在url里面构造index.php?ac=flags&fn=flag.txt 可以解决

后来发现了另一道题

如下图:
image
这道题传入的参数是空,全部是空,回去试一下那道题居然不行,很奇怪,看看题目有什么不同,看到了== 和===一个是松散比较一个是严格比较,但是第一道题如果是空和空也会返回真啊,一脸懵逼,后来又发现第一道题对第一个参数的判断条件是empty() 第二个题目是isset(),其实这就是问题所在empty()和isset()究竟有什么区别?

查查资料

image

image

自己也写了一个简单的函数测试一下

image
返回you
image
返回kong
image
返回kong
image
返回kong

总结一下

empty 不仅仅检查变量是不是存在,还会检查变量的值。变量不存在,或者变量存在但是值为’假’,就认为是空。
isset 只会检查变量是不是存在,变量不存在也就是NULL才认为是空,哪怕是“”也会认为存在。

文章目录
  1. 1. 一道CTF引起
  2. 2. 后来发现了另一道题
  3. 3. 查查资料
  4. 4. 自己也写了一个简单的函数测试一下
  5. 5. 总结一下
|