可以看到是黑名单过滤。如果匹配到关键字则进入到notfound方法,我们看一下notfound方法是怎么处理这些危险数据的。
我去,直接die掉程序。那么$this->get的过滤就非常严格。我们回到57行继续往下通读。
59-63行只是简单的unset变量操作。
这里我们回到hdwiki这个构造方法中,看一下load_control方法。
我们重点去看80-83行的代码逻辑,因为该分支属于正常的控制器分支。$controlfile的值为 ./control/可控值.php文件,在第81行可以看到包含文件操作。我们这里看一下正常的控制器的逻辑是什么样的。
可以看到程序的控制器的类名都定义为control,OK,我们回过头来继续通读,只是看一眼控制器而已。
可以看到包含之后就没有什么其他操作了。因为在index.php文件中的最后一行中有调用该类的run方法,我们读一下run方法看看是怎么玩的。
run方法的逻辑没有想象当中的那么复杂,其实第88行也就是看一下控制器的原因,该系统将所有控制器的名称都定位为control,所以才有new control这一行的操作。
$exemption后面有注释,是免检方法的标志(免检方法:不会查看当前用户是否有访问权限,都会无任何限制的去调用)。
在94-97行中,如果方法名称为hd,则不会进入到该分支,在107行中的if判断中即可知道,如果方法名称为hd,则不管当前用户权限如何,都会去调用hd方法。所以这里hd就是免检方法。
某个控制器的其他方法,则是根据代码逻辑来判断是否有权限访问限制,如果权限不够,那么禁止调用,如果权限够大,那么可以调用。
我们这里可以在./control/目录下定义heihu_577.php文件,内容为:
<?php
class control extends base{
public function hd(){
echo 'helloworld';
}
}
调用结果:
0x02 控制器结构了解
本次通读分为两次通读的原因,是基础控制器也有它自己本身的逻辑。
我们废话不多说,直接看一下普通的控制器。
我们可以看到class control extends base,继承了base类,这个类在我们之前了解框架结构时,有包含到base.class.php文件,我们看一下该文件是怎么玩的。
可以看到base类,定义了同名构造方法(function base)。我们看一下这个方法做了一些什么操作。