基础
- php类与对象
类class:一个共享相同结构和行为的对象的合集
<?php
class XXX{
var $var1;
var $var2="string";
function fuc($arg1,$arg2){
..函数体..
}
...
}
对象Object
类的实例,
$中华田园犬= new 犬类;
$kitty = new Cat;
他们两者的关系,就相当于犬类和中华田园犬的关系。
- Magic函数
Magic Methods(魔术方法):一种特殊的方法,当对 对象执行某些操作时会覆盖php的默认操作。
__construct :当一个对象创建时被调用
__destruct :当一个对象销毁时被调用
__toString :当一个对象被当作一个字符串使用
__sleep :在对象被序列化之前运行
__wakeup :在对象被反序列化之后被调用
__serialize() :对对象调用serialize()方法,PHP 7.4.0 起
__unserialize() :对对象调用unserialize()方法,PHP 7.4.0 起
__call() :在对象上下文中调用不可访问的方法时触发
__callStatic() :在静态上下文中调用不可访问的方法时触发
__get() :用于从不可访问的属性读取数据
__set() :用于将数据写入不可访问的属性
__isset() :在不可访问的属性上调用isset()或empty()触发
__unset() :在不可访问的属性上使用unset()时触发
__invoke() :当脚本尝试将对象调用为函数时触发
magic函数的使用,方便了对象的创建、销毁等去统一控制。相当于预埋了一个控制点。
序列化与反序列化
-
作用:传输对象,用作缓存(cookie,session)。
-
PHP的对象,存活时存放在内存中,这时可以访问它的属性,调用方法,一旦代码运行完毕,对象消亡就访问不到了,若有需求要访问这个对象,在另一个class中调用就无法做到,那若以某种形式存储并恢复到内存中就可以访问,也可以传到其他地方用,这种把对象转化为字符的形式称为序列化,反之 反序列化。
-
serialize() :序列化,产生一个可存储的值的表示,下图中展示了序列化后的格式。基本上格式:“变量类型:[个数(字符串等才有)]:变量值;”
其他的序列化格式:
json字符串、xml字符串格式、二进制格式、字节数组。
如果不想一些数据被序列化,用__sleep()重写,将要返回的用数组写到__sleep中。
unserialize():反序列化。注意哦,在反序列化中,我们是可以将一些参数改变的。在php7.4.0版本中,如果类中同时定义了__unserialize()和__wakeup()两个魔术方法,只有__unserialize()方法生效,__wakeup()方法会被忽略。
-
漏洞
- unserialize函数的参数可控,如通过get请求传参。
- 脚本中定义了magic方法,且方法中向php文件做读写数据或者执行命令的操作,如_destruct()、 unlink().
- 操作内容需要有对象中的成员变量的值,如filename。
我在使用phpstorm时报错:PHP Warning: PHP Startup: Unable to load dynamic library ‘mysqli’ (tried: C:\php\ext\mysqli (找不到指定的模块。), C:\php\ext\php_mysqli.dll (找不到指定的模块。)) in Unknown on line 0
解决在安装PHP的文件路径中找到php.ini,把extension_dir = “D:\WEB\PHP\ext” 取消注释,就可以解决了。