题如下:
先分析代码:
1)isset行代表判断一个通过get方法传递的pass变量是否被定义,因此需要传递一个get类型的pass参量,即在链接后面?pass=才可以进入if
2)$pass代表获得GET方法传递的参数,也即浏览器“pass=”后面的参数
3)get_magic_quotes_gpc是获取php处理magic_quotes_gpc的状态,php为了安全,引入这个状态函数,用来判断页面上的sql查询语句中存在单引号的情况,如果打开了则单引号前面加/以防sql注入
4)stripslashes方法是恢复单引号,将前面的/删除的操作,简言之当magic_quotes_gpc = On时,系统会自动处理单引号等问题,用不用addslashes()和stripslashes()都没关系,但是如果添加数据时用了addslashes(),那么显示数据时必须要stripslashes()
5)后面是关键,把$pass给反序列化,并判断反序列化的结果,如果反序列化失败则不会进入if,因此需要对pass里的内容进行序列化
6)在if里面,最关键的是$v->secret === $v->enter这一恒等式,这说明这两个变量必须始终相等,进一步意味着它们应该指向同一位置,进动才能一致,因而这里有一个$v->secret到$v->enter浅拷贝的问题
因此整理思路:a、需要在链接后面以?pass=的方式去输入 b、输入的应该是调用serialize序列化后的结果 c、序列化之前,需要对$v->secret到$v->enter有一个浅拷贝 d、由于$v->secret和$v->enter,而secret和enter又是just4fun的成员变量,也是$v的成员变量($v->标识),因此$v序列化前应该是just4fun的一个实例,其中实现了secret到enter的浅拷贝,然后序列化后作为pass的参数输入
直接上代码:
<?php
class just4fun { var $enter; var $secret; } $test = new just4fun(); $test->enter = &$test->secret; $serTest = serialize($test); print_r($serTest);
?>
输出结果:
在页面上的验证结果: