Command Palette

Search for a command to run...

PHP 在線取消序列化:無需 PHP 伺服器即可讀取序列化資料

PHP 在線取消序列化:無需 PHP 伺服器即可讀取序列化資料

T
Toolz Team
|Jul 10, 2026|13 閱讀

編碼 合集的一部分

該格式在實作之外沒有規範;這 PHP手冊 unserialize() 是參考,並且明確傳遞不受信任的輸入是不安全的。

第一次序列化的 PHP 資料花費了我一個下午的時間,這是一張 WP Adminify 支援票證。用戶'儀表板小工具設定失控,"設定和報價;他們描述的是住在 wp_options 表格為看起來像線噪聲的單一序列化字串: a:4:{s:8:"_builtin";b:1;.... 我看不懂,一眼就看不出出了什麼問題,我也不想把一個完整的PHP環境編出來 print_r 一行。那天下午,這就是為什麼我關心擁有一個距離瀏覽器選項卡很遠的解碼器。

如果您在 WordPress、WooCommerce、Laravel 或任何舊版 PHP 程式碼庫中工作,無論您是否願意,您都遇到了序列化資料。它顯示在選項表、會話檔案、快取儲存和發布元中。當某些內容損壞時,能夠快速讀取它是五分鐘修復和下午修復之間的區別。

本指南涵蓋了序列化格式的實際內容以及如何使用 解碼它 取消序列化 toolz。dev 上的工具,以及 - 重要的是 - 在信任非英語資料的輸出之前您需要了解的一個真正的限制。

TL;DR: PHP serialize() 將值打包到鍵入的字串中,例如 a:2:{s:4:"name";s:5:"Alice";...} 每件作品都有其類型和長度。這 取消序列化工具 在瀏覽器中解析它並將其顯示為一棵樹, print_r, var_dump,或 JSON - 沒有 PHP 伺服器,沒有資料上傳。大警告 我自己驗證了:它以 UTF-16 代碼單位而不是位元組計算字串長度,因此包含重音符號、表情符號或 CJK 字元的序列化資料可能會錯誤解析或失敗。對於 ASCII 數據,它是可靠的。它讀取資料;它不會解析物件引用或讓您就地編輯。

什麼是PHP序列化,真的嗎?

序列化將 PHP 值(數組、物件、字串、整數等)轉換為平面字串,您可以將其儲存在資料庫列或檔案中,然後使用進行重建 unserialize(). 有兩個功能可以完成工作: serialize() 將值轉換為字串,並且 unserialize() 將其轉換回來。

一旦您知道程式碼,該格式的可讀性就在於每個值都宣布其類型和大小。這是整個詞彙:

s:5:"hello"              // string:  s:length:"value"
i:42                     // integer: i:value
d:3.14                   // double:  d:value
b:1                      // boolean true (b:0 is false)
N;                       // null
a:2:{...}                // array:   a:count:{key;value;...}
O:8:"ClassName":1:{...}  // object:  O:namelen:"Class":propcount:{...}

所以序列化的關聯數組如下所示:

a:3:{s:4:"name";s:10:"John Smith";s:5:"email";s:16:"[email protected]";s:4:"role";s:5:"admin";}

這只是這個 PHP 陣列,包裝嚴密:

array(
    'name'  => 'John Smith',
    'email' => '[email protected]',
    'role'  => 'admin'
)

機器緊湊,下午 2 點接到支援電話時,人類幾乎無法讀取。這就是工具解決的整個問題。

toolz。dev Unserialize 工具如何解碼它?

您貼上字串,它會在瀏覽器中直接用 JavaScript 解析格式並呈現結果。我在編寫此內容時根據工具和#39 測試了每個內容;在編寫此內容時,我使用自己的解析器測試了每個內容,因此下面的行為是它實際所做的,而不是手冊假設的。

順序整數鍵控數組作為實數列表返回。 a:2:{i:0;s:5:"apple";i:1;s:6:"banana";} 解碼至 ["apple", "banana"]. 關聯數組作為鍵控物件返回。嵌套結構正確嵌套,數組在物件內的數組內,一直向下。

物件保留其類別名稱。 O:4:"User":2:{s:4:"name";s:3:"Bob";...} 用a解碼 __class__ 的標記 "User" 加上它的屬性,所以你可以看到類型和資料。它甚至可以處理私有和受保護屬性的尷尬情況,PHP 在類別名稱周圍使用空位元組前綴進行序列化 - 工具會剝離這些屬性並向您顯示乾淨的屬性名稱。

您有八種輸出格式可以在以下格式之間切換:樹狀視圖, print_r, var_dump, var_export,克魯莫、FirePHP、dBug 和普通的 JSON。我住在 Tree View 中是為了探索,而 JSON 則是為了複製到其他東西,但如果你的肌肉記憶有期望的話 var_dump 輸出,就在那裡。

您需要知道的一個限制:多位元組字串

這是我希望有人在信任生產資料解碼器之前告訴我的部分,所以它是預先的。

PHP's 序列化格式測量字串長度 位元組. 工具測量它 JavaScript 字串長度,計算 UTF-16 代碼單位。對於普通 ASCII,這些數字相同,因此英語資料解碼完美。當字串包含多位元組 UTF-8 字元時,它們就會發散。

以單字 "café。"為例。在 UTF-8 中,"é" 是兩個字節,因此 PHP 將其序列化為 s:5:"café" - 長度為五,計數位元組。工具讀取它 5 並抓住五個 代碼單位 從字串來看,這是 café" - 它吞下了結束語並失去了它的位置。我正是這樣跑的:一個獨立的 s:5:"café"; 解碼為錯誤的值,並且在數組內類似 a:2:{s:1:"a";s:5:"café";s:1:"b";i:1;} 它徹底失敗了 Unknown type ':' at position 25.

實用要點:如果您正在調試純 ASCII 的 WordPress 選項 - 大多數插件設定、slugs、布林標誌 - 您沒問題。如果序列化資料包含重音名稱、表情符號或 CJK 文本,則解碼可能會損壞或錯誤,這是工具中的真正錯誤,而不是您的資料。 (鄭重聲明,我們一端的修復方法是解析 UTF-8 位元組長度,而不是 .length;它在我的清單上。)當您點擊它時,WP-CLI'伺服器上的序列化感知命令是可靠的後備。

有一個相關的、更溫和的警告: var_dump 輸出使用相同的代碼單位計數報告字串長度,因此 var_dump("café") 顯示 string(4) 真正的 PHP 會說什麼 string(5),表情符號顯示的長度與 PHP&#39 不符;s 位元組計數。將這些數字讀取為 "JavaScript 長度,"不是&引用;PHP 位元組長度。&引用;

為什麼需要在 PHP 之外取消序列化資料?

原因有很多,但幾乎沒有一個是"為了好玩。&引用;

調試是最重要的。錯誤報告顯示使用者'設定錯誤;這些設定是資料庫中的序列化 blob;在解碼之前您看不到問題。我使用的工作流程是: SELECT option_value FROM wp_options WHERE option_name = 'widget_text';,複製結果,貼上到 取消序列化工具,並閱讀樹。十秒與編寫一次性的 PHP 腳本相比。

遷移是偷偷摸摸的。序列化字串嵌入了自己的長度,因此在資料庫轉儲上簡單地查找和替換 - 例如,將舊網域交換為新網域 - 在不更新長度前綴的情況下更改字串內容,並且每個受影響的值都變得不可序列化。解碼首先會準確地向您顯示哪些值攜帶該域,以便您知道普通的搜尋和替換會破壞什麼。 (替換本身的正確工具是 WP-CLI's search-replace,這理解序列化。)

然後是快取和會話檢查 - PHP 應用程式中的 Redis、Memcached 和檔案快取通常保存序列化值 - 以及安全性審查,您需要查看實際儲存的內容,然後才能判斷是否安全。

在瀏覽器中解碼序列化資料安全嗎?

比在 PHP 中執行更安全,並且值得理解原因。

PHP'是本地人 unserialize() 擁有悠久的安全歷史。透過精心設計的字串,它可以實例化任意物件並觸發它們的魔法方法((__wakeup, __destruct),在適當的條件下,它會變成物件注入攻擊,最壞的情況下,會變成遠端程式碼執行。這就是為什麼長期建議是永遠不要打電話 unserialize() 在不可信的輸入下,並通過 ['allowed_classes' => false] 當你必須的時候。

瀏覽器工具迴避了這一切,因為它永遠不會 運行 PHP。它讀取字串格式並顯示結構 - 沒有建立 PHP 對象,沒有魔法方法觸發,也沒有解釋器可供利用。資料也保留在您的裝置上;它是在本地解析的,並且永遠不會發送到伺服器,當序列化的 blob 是會話或您不想上傳的其他內容時,這一點很重要。所以為了 檢查 不受信任的序列化數據,瀏覽器確實更安全。

原生 PHP unserialize() toolz。dev 瀏覽器工具
實例化物件 是的(注射風險) 否 - 僅讀取結構
在伺服器上運行 是的 瀏覽器中不 - 本地
安全地輸入不受信任的輸入 僅與 allowed_classes 是的,它永遠不會執行
處理多位元組長度 正確(位元組) 不可靠(代碼單位)
解決物件引用 是的 不--表演 [Reference]
目的 重建即時值 檢查並閱讀

表格也是權衡的誠實總結:瀏覽器工具是安全的閱讀器,而不是語言功能的直接替代品。

現實世界中常見的來源是什麼?

如果你在這裡,它可能是其中之一。 WordPress 嚴重依賴序列化 wp_options - widget_text, sidebars_widgets, theme_mods_*,活動插件列表,cron 時間表。 WooCommerce 將產品變體、屬性和自訂欄位儲存為序列化的後元,這就是為什麼定價錯誤的產品經常追溯到序列化值的原因。 Laravel 使用序列化進行檔案快取和會話儲存。 Magento's 設定係統充滿了它。到處都是相同的格式;相同的解碼方法。

有幾件事該工具無法做到

兩個誠實的邊界。它不解析引用 - PHP 可以序列化指向早期值的指標 ((r: 或者 R:),工具將這些顯示為文字 [Reference] 標記而不是跟隨它們。它是閱讀器,而不是編輯器:沒有"更改此值並重新序列化和引用;模式。要修改序列化數據,請對其進行解碼,更改 PHP 或 JSON,然後在 PHP 側重新序列化。如果您必須手動編輯原始字串,請記住您還必須修復長度前綴,並且根據上面的部分 - 計算位元組,而不是字元。

常見問題

PHP 序列化的用途是什麼?

它將陣列和物件等複雜值轉換為單一字串,該字串可以駐留在資料庫列、檔案或快取中,並稍後重建。 WordPress、WooCommerce、Laravel 和 Magento 都大量使用它來進行設定、會話資料和快取值。

如果沒有 PHP 伺服器,我可以取消序列化 PHP 資料嗎?

是的。這 取消序列化工具 在瀏覽器中解析 JavaScript 中的序列化 PHP。沒有 PHP 安裝,沒有伺服器,沒有帳戶。

在瀏覽器中解碼序列化資料安全嗎?

是的,而且比 PHP&#39 更安全;自己的 unserialize() 在不受信任的輸入上,因為該工具僅讀取字串結構。它從不實例化 PHP 對象,因此魔法方法會攻擊本機物件 unserialize() 危險根本不可能發生。

為什麼我的序列化字串無法解碼?

通常的原因是截斷的副本(您錯過了尾隨大括號或第一個字元)、查找和替換後的斷斷續續的長度前綴,或實際上未序列化的資料。另一個可以捕捉人:如果字串包含重音字元、表情符號或 CJK 文本,則工具和#39;程式碼單元長度計數可能會錯誤解析它,因為 PHP 以位元組為單位計算字串長度,而工具以 UTF-16 單位計算。

我可以用它解碼 WordPress wp_options 值嗎?

是的 - 這是最常見的用途之一。查詢 option_value,將其貼上並讀取結構。請注意,如果該選項包含多位元組文本,則您可能需要伺服器上的 WP-CLI。

我可以使用此工具編輯序列化資料嗎?

不,它是一個讀者。要變更值、對其進行解碼、在 PHP 或 JSON 中進行編輯,並在 PHP 端重新序列化。手動編輯原始字串意味著自己修復位元組長度前綴,這很容易出錯。

PHP序列化和JSON有什麼不同?

序列化保留 PHP 特定的類型,包括物件類別名稱和私有屬性。 JSON 與語言無關,只知道字串、數字、布林值、null、數組和物件。新程式碼通常更喜歡 JSON,因為 json_decode() 不實例化對象,因此避免了注入風險,JSON 隨處可見。您可以將解碼的結構移至 json 格式化程式 就這樣處理它。

該工具是否處理序列化對象,而不僅僅是數組?

是的。物件解碼時其類別名稱與屬性一起保留,私有或受保護的屬性(PHP 使用空位元組前綴序列化)被清理為輸出中的可讀名稱。

結論

如果您觸摸 WordPress、WooCommerce 或 Laravel,序列化的 PHP 資料是不可避免的,並且能夠按需讀取它,可以將一類令人沮喪的錯誤變成快速錯誤。這 取消序列化工具 在瀏覽器標籤中安全地做到這一點,無需 PHP 伺服器 - 只要您知道它的一個真實邊緣:多位元組字串可以使長度計數跳閘,而 ASCII 資料就是它閃耀的地方。貼上、讀取、修復。當資料充滿重音或表情符號時,請聯絡 WP-CLI。


相關工具:

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!