国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

PHP序列化和反序列化語(yǔ)法的差異

發(fā)布時(shí)間:2021-09-14 11:25 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 網(wǎng)絡(luò )安全 歡迎投稿:712375056

本篇內容介紹了“PHP序列化和反序列化語(yǔ)法的差異”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!

介紹

官方文檔中介紹PHP序列化和反序列化如下:

所有php里面的值都可以使用函數serialize()來(lái)返回一個(gè)包含字節流的字符串來(lái)表示。unserialize()函數能夠重新把字符串變回php原來(lái)的值。 序列化一個(gè)對象將會(huì )保存對象的所有變量,但是不會(huì )保存對象的方法,只會(huì )保存類(lèi)的名字。 為了能夠unserialize()一個(gè)對象,這個(gè)對象的類(lèi)必須已經(jīng)定義過(guò)。如果序列化類(lèi)A的一個(gè)對象,將會(huì )返回一個(gè)跟類(lèi)A相關(guān),而且包含了對象所有變量值的字符串。

簡(jiǎn)單說(shuō)序列化是對象轉化字符串的過(guò)程,反序列化是字符串還原對象的過(guò)程。

環(huán)境

文章中所述內容使用環(huán)境如下:

PHP7.3.1、SDK

VSCode

C++和C

環(huán)境配置建議參考:《WINDOWS下用VSCODE調試PHP7源代碼》https://www.jianshu.com/p/29bc0443***6(作者經(jīng)過(guò)幾小時(shí)嘗試后找到最全的版本)

在網(wǎng)上公開(kāi)參數反序列化執行流程已經(jīng)非常詳細,但是對于一些細節地方有一些不足,其中就包括序列化和反序列化之間的語(yǔ)法差異問(wèn)題

差異問(wèn)題

序列化

我們通過(guò)編譯PHP內核源碼分析,發(fā)現PHP序列化在默認情況下在對象轉換中加入:{和}用來(lái)拼接成字符串。

[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, '}');

咱們來(lái)看上面這段代碼,PHP會(huì )使用smart_str_appendl為序列化字符串前后拼接:{和},從var.c的第882行開(kāi)始進(jìn)入序列化邏輯。在第896行進(jìn)行序列化字符串拼接,第952行和第995行,對于內嵌方法進(jìn)行拼接。

反序列化

反序列化是將序列化的字符串,按照一定語(yǔ)法規則進(jìn)行轉化還原。

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

通過(guò)內核代碼能夠看到第655行進(jìn)入反序列化,反序列化是利用詞法掃描,判斷各項符號轉換對應對象。能夠看到反序列化中對于}進(jìn)行了處理,處理中只是對計數器加一并沒(méi)有其他操作。

實(shí)際作用

反序列化語(yǔ)法的差異,對于安全防護設備判斷反序列化產(chǎn)生很大的影響。在Snort中,有段規則如下:

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

在攻擊載荷中可以使用大多數字符代替{},從而導致規則失效。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

php
亚洲AV日韩精品久久久久久A| 女人被弄到高潮的免费视频| 精品少妇一区二区三区视频| 国产凸凹视频一区二区| 超碰色偷偷男人的天堂| 又黄又硬又湿又刺激视频免费|