当前位置:首页 > PHP教程 > 正文内容

PHP序列化和反序列化语法差别题目【php教程】,PHP

搜教程4年前 (2019-12-01)PHP教程160

官方文档中引见PHP序列化和反序列化以下: (引荐进修:PHP视频教程)

一切php内里的值都能够运用函数serialize()来返回一个包含字撙节的字符串来示意。unserialize()函数能够从新把字符串变回php本来的值。序列化一个对象将会保留对象的一切变量,然则不会保留对象的要领,只会保留类的名字。为了能够unserialize()一个对象,这个对象的类必需已定义过。假如序列化类A的一个对象,将会返回一个跟类A相干,而且包含了对象一切变量值的字符串。

简单说序列化是对象转化字符串的历程,反序列化是字符串复原对象的历程。

环境

文章中所述内容运用环境以下:

PHP7.3.1、SDK
VSCode
C++和C

环境设置发起参考:《WINDOWS下用VSCODE调试PHP7源代码》

在网上公然参数反序列化实行流程已异常细致,然则关于一些细节处所有一些不足,其中就包含序列化和反序列化之间的语法差别题目

差别题目

序列化

我们经由过程编译PHP内核源码剖析,发明PHP序列化在默许状况下在对象转换中到场:{和}用来拼接成字符串。

[var.c]
Line:882
static void php_var_serialize_intern()

Line:896
if (ce->serialize(struc, &serialized_data, &serialized_length, (zend_serialize_data *)var_hash) == SUCCESS) {
                        smart_str_appendl(buf, "C:", 2);
                        smart_str_append_unsigned(buf, ZSTR_LEN(Z_OBJCE_P(struc)->name));
                        smart_str_appendl(buf, ":\"", 2);
                        smart_str_append(buf, Z_OBJCE_P(struc)->name);
                        smart_str_appendl(buf, "\":", 2);

                        smart_str_append_unsigned(buf, serialized_length);
                        smart_str_appendl(buf, ":{", 2);
                        smart_str_appendl(buf, (char *) serialized_data, serialized_length);
                        smart_str_appendc(buf, '}');
                    }

Line:952
smart_str_appendl(buf, ":{", 2);

Line:995
smart_str_appendc(buf, '}');

我们来看上面这段代码,PHP会运用smart_str_appendl为序列化字符串前后拼接:{和},从var.c的第882行最先进入序列化逻辑。在第896行举行序列化字符串拼接,第952行和第995行,关于内嵌要领举行拼接。

反序列化

反序列化是将序列化的字符串,根据肯定语法划定规矩举行转化复原。

[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? */
}

经由过程内核代码能够看到第655行进入反序列化,反序列化是应用词法扫描,推断各项标记转换对应对象。能够看到反序列化中关于}举行了处置惩罚,处置惩罚中只是对计数器加一并没有其他操纵。

现实作用

反序列化语法的差别,关于平安防护装备推断反序列化发生很大的影响。在Snort中,有段划定规矩以下:

alert tcp any any -> any [80,8080,443] (uricontent:".php"; pcre:"/\{\w:.+?\}/"; sid:1; msg:php_serialize;)

在进击载荷中能够运用大多数字符替代{},从而致使划定规矩失效。

总结

在红队进击中能够应用PHP序列化和反序列化语法差别,从而到达绕过防护的目标。

在蓝队防备中发起斟酌定义中所述不会保留对象的要领,只会保留类的名字。,阻拦保留类的名字,以及语法中雷同的字符比方冒号举行防备。

以上就是PHP序列化和反序列化语法差别题目标细致内容,更多请关注ki4网别的相干文章!

扫描二维码推送至手机访问。

版权声明:本文由搜教程网发布,如需转载请注明出处。

本文链接:https://www.sojiaocheng.cn/15731.html

标签: PHP
分享给朋友:

“PHP序列化和反序列化语法差别题目【php教程】,PHP” 的相关文章

2019年最新PHP典范面试题及答案,PHP程序员必看【php教程】,PHP经典面试,PHP

1、用起码的代码写一个求3值最大值的函数. function who($a,$b,$c) { return $a &gt; $b ? ($a &gt; $c ? $a : $c) : ($b &gt; $c ? $b : $c); } echo who(33,53,12...

php opendir函数怎样用【php教程】,opendir函数

php opendir函数怎样用【php教程】,opendir函数

php opendir()函数用于翻开目次句柄,其语法是opendir(path,context),参数path必须,指划定要翻开的目次途径。 php opendir函数怎样用? php opendir()函数 语法 作用:翻开目次句柄。 语法: opendir(path,cont...

php中变量学问的细致引见【php教程】,php

本篇文章给人人带来的内容是关于php中变量学问的细致引见,有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 变量的寄义 用于存储信息的容器,在顺序运转时期,能够变化的量 变量的定名划定规矩变量以$符最先变量名只能以字母或下划线最先变量名只能是字母,下划线,数字,不能有特别字符...

PHP梳排序(Comb Sort)算法的完成【php教程】,PHP梳排序(Comb Sort)算法

PHP梳排序(Comb Sort)算法的完成【php教程】,PHP梳排序(Comb Sort)算法

梳子排序或梳排序是冒泡排序的变体。与希尔(Shell)排序相似,梳排序(Comb Sort)增加了比较和交流中运用的差异。有些完成是在距离小于肯定数目时运用插入排序。基础的主意是消弭列表末端四周的小值,由于在冒泡排序中,这些会大大减慢排序速率。而列表开首的大值不会在冒泡排序中形成题目。 在...

guzzlehttp通报自定义cookie的要领引见(附代码)【php教程】,guzzle,php

本篇文章给人人带来的内容是关于guzzlehttp通报自定义cookie的要领引见(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 guzzlehttp是一个异常壮大的php言语的http client包,支撑保留前面要求服务端返回的cookie信息用于后续的要求。...

PHP与nginx之间运行机制及其道理的细致引见【php教程】,PHP

PHP与nginx之间运行机制及其道理的细致引见【php教程】,PHP

本篇文章给人人带来的内容是关于PHP与nginx之间运行机制及其道理的细致引见,有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 一、提高Nginx与Php-fpm相干知识点 Nginx是什么 Nginx ("engine x") 是一个高性能的HTTP和反向代办服务器,也是一个...