• 周二. 10 月 8th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

php深拷贝和浅拷贝

admin

11 月 28, 2021

题如下:

先分析代码:

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);
?>

输出结果:

在页面上的验证结果:

发表回复