搜索
查看: 1491|回复: 0

深入讲解PHP的对象注入(Object Injection)

[复制链接]

4721

主题

4721

帖子

4672

积分

限制会员

积分
4672
发表于 2018-2-11 11:56:58 | 显示全部楼层 |阅读模式

            前言
虽然这篇文章叫做PHP对象注入,但是本质上还是和PHP的序列化的不正确使用有关。如果你阅读了PHP中的SESSION反序列化机制对序列化就会有一个大致的认识。PHP对象注入其实本质上也是由于序列化引起的。
基础知识
在php类中可能会存在一些叫做魔术函数(magic 函数),这些函数会在类进行某些事件的时候自动触发,例如__construct()会在一个对象被创建时调用, __destruct()会在一个对象销毁时调用, __toString当对象被当做一个字符串的时候被调用。常见的魔术函数有__construct() 、 __destruct() 、 __toString() 、 __sleep() 、 __wakeup() 。
举例如下:
varr1."
";
}
public function __construct(){
  echo "__construct
";
}
public function __destruct(){
  echo "__destruct
";
}
public function __toString(){
  return "__toString
";
}
public function __sleep(){
  echo "__sleep
";
  return array('varr1','varr2');
}
public function __wakeup(){
  echo "__wakeup
";
}
}
$obj = new test();  //实例化对象,调用__construct()方法,输出__construct
$obj->echoP();   //调用echoP()方法,输出"abc"
echo $obj;    //obj对象被当做字符串输出,调用__toString()方法,输出__toString
$s =serialize($obj);  //obj对象被序列化,调用__sleep()方法,输出__sleep
echo unserialize($s);  //$s首先会被反序列化,会调用__wake()方法,被反序列化出来的对象又被当做字符串,就会调用_toString()方法。
// 脚本结束又会调用__destruct()方法,输出__destruct
?>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

长春门户网站

长春门户网是网民了解长春的网络窗口,同是提供长春地区百姓生活分类供求信息的门户网站,同时提供长春网站建设、长春网站设计,我们将逐步的完善网站分类信息资源;

长春门户网二维码

联系我们

  • 工作时间:早上8:00 - 晚上5:30
  • 投稿联系:13624467185(微信同号)
  • 反馈邮箱:5053050@QQ.com
  • 公司地址:吉林省长春市亚泰大街与自由大路交汇五环国际大厦1408室

QQ|小黑屋|手机版|Archiver|cc! ( 吉ICP备2021009740号-8 )

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表