加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

PHP序列化和反序列化语法差别问题

发布时间:2022-05-30 09:04:09 所属栏目:安全 来源:互联网
导读:官方文档中介绍PHP序列化和反序列化如下: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类
         官方文档中介绍PHP序列化和反序列化如下:
 
         所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。 为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。
 
1. 序列化
 
         我们通过编译PHP内核源码分析,发现PHP序列化在默认情况下在对象转换中加入:{和}用来拼接成字符串。
 
2. 反序列化
 
         反序列化是将序列化的字符串,按照一定语法规则进行转化还原。
 
复制
[var_unserialize.c]
Line:655
static int php_var_unserialize_internal()
 
Line:674
{
    YYCTYPE yych;
    static const unsigned char yybm[] = {
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
        128, 128, 128, 128, 128, 128, 128, 128,  
        128, 128,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
          0,   0,   0,   0,   0,   0,   0,   0,  
    };
    if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
    yych = *YYCURSOR;
    switch (yych) {
    case 'C':
    case 'O':    goto yy4;
    case 'N':    goto yy5;
    case 'R':    goto yy6;
    case 'S':    goto yy7;
    case 'a':    goto yy8;
    case 'b':    goto yy9;
    case 'd':    goto yy10;
    case 'i':    goto yy11;
    case 'o':    goto yy12;
    case 'r':    goto yy13;
    case 's':    goto yy14;
    case '}':    goto yy15;
    default:    goto yy2;
    }
 
Line:776
yy15:
    ++YYCURSOR;
    {
    /* this is the case where we have less data than planned */
    php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data");
    return 0; /* not sure if it should be 0 or 1 here? */
 
反序列化语法的差异,对于安全防护设备判断反序列化产生很大的影响。在Snort中,有段规则如下:
 
复制
alert tcp any any -> any [80,8080,443] (uricontent:".php"; pcre:"/{w:.+?}/"; sid:1; msg:php_serialize;)
 
在攻击载荷中可以使用大多数字符代替{},从而导致规则失效。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读