=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较 == 在进行比较的时候,会先将字符串类型转化成相同,再比较 如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
序列化
定义:利用serialize()
函数将一个对象转换为字符串形式
我们先看一下直接输出对象是什么效果,代码如下
<?php
class test{
public $name="ghtwf01";
public $age="18";
}
$a=new test();
print_r($a);
?>
效果如下
这个时候我们利用serialize()
函数将这个对象进行序列化成字符串然后输出,代码如下
<?php
class test{
public $name="ghtwf01";
public $age="18";
}
$a=new test();
$a=serialize($a);
print_r($a);
?>
效果如下
如果不是public
方法那么后面的读取方法就有点不一样,例如代码如下
<?php
class test{
public $name="ghtwf01";
private $age="18";
protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);
?>
效果如下
private分析:
这样就发现本来是age
结果上面出现的是testage
,而且testage
长度为7
,但是上面显示的是9
查找资料后发现private属性序列化的时候格式是%00类名%00成员名,%00
占一个字节长度,所以age
加了类名后变成了testage
长度为9
protect分析:
本来是sex
结果上面出现的是*sex
,而且*sex
的长度是4
,但是上面显示的是6
,同样查找资料后发现protect属性序列化的时候格式是%00*%00成员名
这里介绍一下public、private、protected的区别
public(公共的):在本类内部、外部类、子类都可以访问
protect(受保护的):只有本类或子类或父类中可以访问
private(私人的):只有本类内部可以使用
反序列化
定义:反序列化就是利用unserailize()
函数将一个经过序列化的字符串还原成php代码形式,代码如下
<?php
$b='序列化字符串';
$b=unserialize($b);
?>
反序列化漏洞原理
到这儿也许大家会想着序列化过去再反序列化回来,不就是形式之间的转换吗,和漏洞有什么关系
这里先掌握php常见的魔术方法,先列出几个最常见的魔术方法,当遇到这些的时候就需要注意了
附上讲解魔术方法的链接:https://segmentfault.com/a/1190000007250604
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当反序列化后的对象被输出的时候(转化为字符串的时候)被调用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用