WeChall_PHP-0817

题目:

核心代码:
<?php
if (isset($_GET['which']))
{$which = $_GET['which'];switch ($which)        {case 0:case 1:case 2:require_once $which.'.php';                break;default:echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);break;}}
?>
php关键语法分析:
Switch 语句
如果您希望有选择地执行若干代码块之一,请使用 Switch 语句。使用 Switch 语句可以避免冗长的 if..elseif..else 代码块。语法
switch (expression)
{
case label1:expression == label1 时执行的代码 ;break;
case label2:expression == label2 时执行的代码 ;break;
default:表达式的值不等于 label1 及 label2 时执行的代码;
}工作原理:对表达式(通常是变量)进行一次计算
把表达式的值与结构中 case 的值进行比较
如果存在匹配,则执行与 case 关联的代码
代码执行后,break 语句阻止代码跳入下一个 case 中继续执行,这里需要注意!!!如果没有break语句,那么会默认执行下一个case语句
如果没有 case 为真,则使用 default 语句

注:这里需要加强注意的是,php中switch/case是使用松散比较,也就是弱类型比较的,并不是=,是==

代码详解:
<?php
if (isset($_GET['which']))   //检测变量which是否设置,并且不是 NULL
{$which = $_GET['which'];   //get请求参数whichswitch ($which)        {   //switch用法见上面的php关键语法分析,要记住这里的switch是使用的松散比较!!!下面实际测试时会写到case 0:   //还有一点很重要的,这里的case语句后面如果没有break,他会继续执行下面case语句的代码段,并不会再比较下面表达式值与case值是否相等,而是直接执行代码段case 1:case 2:require_once $which.'.php';                break;   //包含文件$which'.php'default:   //如果表达式的值与case的值没有一个相等的,那么就执行default语句段echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);break;}}
?>

这里希望我们使用文件包含,包含solution.php文件,因此,我们尝试包含0

http://www.wechall.net/challenge/php0817/index.php?which=0

发现可以包含,那么这是我们可以将0改为solution

http://www.wechall.net/challenge/php0817/index.php?which=solution

有人就要说了,这里代码显示,只能是$which=0或1或2时,才能执行对应case里的代码段。
因此,这里我就要说一说我之前提到的switch/case使用的是松散类型比较,就是当你输入solution时,它会进行

$which==0,$which==1,$which==2的比较,$which=solution时,也就是判断solution==0与solution==1与solution==2,只要有一个匹配就执行改代码段,没有匹配就执行default

这里的松散比较,也就是弱类型比较,先判断solution==0是否为true
注:使用==进行比较时,如果是数字与字符串进行比较(或者字符串与数字),会先将字符串类型转化成数值型再比较,字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。这里的solution因为是字母开头,最后0==0,于是执行case 0下面的代码段,但是case 0 下面没有代码段,又没有break语句,但此时case 0 是为true的,在它代码段中没有遇到break的情况下,继续执行case 1下的代码段,又因为case 1下又没有break语句,再执行case 2下的代码段,包含文件solution.php,这时,有一个break语句,代码执行结束。

注:如果第一个case匹配成功,执行下面代码段时都没有break语句,那么再执行完所有的代码段后,再执行default下的代码段才会退出代码执行,也就是从匹配成功开始,后面的代码段只要没有break,全部执行一遍,直到遇到break为止,就不再执行后面的代码段了。
例:

<?php
$color="red";
switch ($color)
{case "red":echo "red";case "blue":echo "blue";case "green":echo "green";default:echo "all no";
}
?>

执行结果:

redbluegreenall no

参考链接:
https://www.tuziang.com/combat/1542.html
http://ju.outofmemory.cn/entry/345804

WeChall_PHP-0817相关推荐

  1. 软件项目管理0817:一夜项目管理——把任务进度计划分配给负责人

    软件项目管理0817:一夜项目管理--把任务进度计划分配给软件项目管理0817:一夜项目管理--把任务进度计划分配给负责人 1.任务都有负责人,而且许多任务负责人有可能不止一个.用A代表负责人,B代表 ...

  2. 新概念0817:终身学习

    新概念0817:终身学习 终身学习在刚毕业的时候就提,那个时候感觉很酷,但是自己从事的行业虽然没有外界所说的发展那么快但是技术更新确实很快,学习已经成为一种习惯. 随着中国人口老龄化的压力开始显现,医 ...

  3. 人生第一次手术:0817

    人生第一次手术:0817 T+10天,身体已经无碍,伤口微微有点痒,但是不耽误走路.活动,到医院打印了病历,虽然耽误了一点时间,但是将本次治疗的全过程都打印出来,然后登陆商业保险软件,上传资料,个人开 ...

  4. 2008年北京奥运会赛程表—— 08-17

    2008年北京奥运会赛程表-- 08-17 查看8月 0809101112131415161718192021222324 日赛程 <script type="text/javascr ...

  5. 小陈java学习笔记0817

    网络编程 1.计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计 ...

  6. 【日记本砸】21.05.08-17 重要的不是抢先别人跑多远,而是那种越跑越有劲的状态

    句子 生活 你不是想死,你只是不想这样活着 你不是想放假,你只是这样上课太憋屈 困境 只看得进PPT,却看不进纸质书. 只看得进示意图,却看不进文字. 会不会有一天饮用纯净水变得很贵很奢侈啊 Star ...

  7. pytorch空间变换网络

    pytorch空间变换网络 本文将学习如何使用称为空间变换器网络的视觉注意机制来扩充网络.可以在DeepMind paper 有关空间变换器网络的内容. 空间变换器网络是对任何空间变换的差异化关注的概 ...

  8. 北京工业大学计算机科学与技术学科评估,本次学科评估进步最大学校之一——北京工业大学...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作为省属高校,这次的结果基本可以从中游211,晋升为顶级211了 2个A类学科,A的土木,A-的环境,都是大学科 其他主干工科,很多都在B以上,7科B+ ...

  9. 西北师范计算机考研调剂,西北师范大学研究生调剂

    现如今,越来越多的企业选择研究生及以上的学历人才进行招聘.但是,考研是选拔性考试,并不是我们想象的那么简单.为此,考研网小编为您整理了"西北师范大学研究生调剂"的内容: 2019年 ...

  10. Centos下安装mysql 总结

    一.MySQL安装 Centos下安装mysql 请点开:http://www.centoscn.com/CentosServer/sql/2013/0817/1285.html 二.MySQL的几个 ...

最新文章

  1. Qt5的cmake文件位置
  2. CV之NS之VGG16:基于TF Slim(VGG16)利用七个不同的预训练模型实现快速NS风格
  3. python合并列表重新排序_python – 将两个已排序的列表合并为一个更大的排序列表...
  4. 学习腾讯的产品管理之道
  5. Linux的实际操作:文件目录类的实用指令(ln history)
  6. 华为鸿蒙系统费电吗,华为鸿蒙系统优势在哪里?
  7. 蓝桥杯 ALGO-1 算法训练 区间k大数查询
  8. 洛谷 P2317 [HNOI2005]星际贸易 解题报告
  9. 计算机名ip自动配置文件,[已解决]批处理如何根据网卡MAC地址自动设置IP和计算机名?...
  10. bios刷写工具_蓝天P750/P751编程器刷BIOS
  11. python3 根据种子文件torrent获取磁力链接
  12. QTreeView 使用 QStandardItemModel
  13. 大数据和数据挖掘是什么关系?
  14. Verified Boot
  15. 提高计算机软件速度的方法,提高电脑速度的10个有效方法
  16. 2022山东国际养老服务业博览会,智慧养老产业展会
  17. 使用非对称加密匿名加好友
  18. Python求最大公约数的五种常见方法
  19. 最近某网站泄露密码数据分析
  20. 联想台式计算机电源,联想台式电脑的电源开关按键在什么位置

热门文章

  1. Centos6.5 安装apache2.4.33部署教程
  2. 数字图像处理--几种图像均值滤波的java实现
  3. String, StringBuilder 与StringBuffer的区别与联系
  4. Innodb锁系统 Insert/Delete 锁处理及死锁示例分析
  5. [译]GC专家系列5-Java应用性能优化的原则
  6. mysql 聚簇索引 和聚簇索引 (二级索引)的 那些事
  7. redis之 zadd、zremrangebyscore、zremrangebyrank、zscore、zcard、zcount、zrangebyscore、zinczrevrankzrevrange
  8. Spring 框架核心概念IoC 随笔
  9. 关于Bitmap中的inBitmap变量的学习与使用
  10. LNMP Nginx 499 问题 第三方回调异常