Command Palette

Search for a command to run...

PHP Unserialize Online: קרא נתונים מסודרים ללא שרת PHP

PHP Unserialize Online: קרא נתונים מסודרים ללא שרת 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 שורה אחת. באותו אחר הצהריים אכפת לי שיהיה לי מפענח שנמצא במרחק של לשונית דפדפן אחת.

אם אתה עובד בוורדפרס, 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 יכול mis-parse או fail.לנתוני ASCII זה אמין.It קורא נתונים; זה לא פותר הפניות אובייקט או נותן לך לערוך במקום.

מהי סדרת 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 בדפדפן שלך ומעבדת את התוצאה. בדקתי כל אחד מאלה מול הכלי ' מנתח משלו בזמן כתיבת זה, כך שההתנהגות למטה היא מה שהוא עושה בפועל, לא מה שמדריך מניח.

מערכים עוקבים עם מפתחות שלמים חוזרים כרשימה אמיתית. a:2:{i:0;s:5:"apple";i:1;s:6:"banana";} מפענח ל ["apple", "banana"]. מערכים אסוציאטיביים חוזרים כאובייקטים עם מפתח. מבנים מקוננים מקננים בצורה נכונה, מערכים בתוך מערכים בתוך אובייקטים, עד למטה.

חפצים שומרים על שם הכיתה שלהם. O:4:"User":2:{s:4:"name";s:3:"Bob";...} מפענח עם א __class__ מרקר של "User" בנוסף המאפיינים שלו, כך שתוכל לראות גם את הסוג וגם את הנתונים. זה אפילו מטפל במקרה המביך של נכסים פרטיים ומוגנים, ש-PHP עושה בסידרה עם קידומות של null-byte סביב שם המחלקה - הכלי מפשיט אותם ומראה לך את שם הנכס הנקי.

אתה מקבל שמונה פורמטי פלט לעבור ביניהם: תצוגת עץ, print_r, var_dump, var_export, Krumo, 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 טהור - רוב הגדרות הפלאגין, slugs, דגלים בוליאניים - אתה בסדר. אם הנתונים המסודרים מכילים שמות מודגשים, אימוג'י או טקסט CJK, הפענוח עלול להשחית או לטעות, וזה באג אמיתי בכלי, לא בנתונים שלך. (למען הפרוטוקול, התיקון בצד שלנו הוא לנתח באורך UTF-8 בתים ולא .length; זה ברשימה שלי.) כאשר אתה לוחץ עליו, פקודות WP-CLI' מודעות לסידרה בשרת הן החזרה האמינה.

יש אזהרה קשורה ועדינה יותר: ה var_dump פלט מדווח על אורכי מחרוזת באמצעות אותה ספירת יחידות קוד, אז var_dump("café") מופעים string(4) איפה PHP אמיתי היה אומר string(5), ואימוג'י מציג אורך שלא יתאים גם ל-PHP's ספירת בתים. קרא את המספרים האלה בתור "JavaScript אורך," לא "PHP אורך בתים."

למה שתצטרך לבטל את הסדרת הנתונים מחוץ ל-PHP?

שפע של סיבות, וכמעט אף אחת מהן אינה " בשביל הכיף."

איתור באגים הוא הגדול. דוח באג אומר שההגדרות של user's שגויות; ההגדרות הן כתם מסודר במסד הנתונים; אינך יכול לראות את הבעיה עד שתפענח אותה. זרימת העבודה שבה אני משתמש היא: SELECT option_value FROM wp_options WHERE option_name = 'widget_text';, העתק את התוצאה, הדבק אותה לתוך בטל סדרה של הכלי, ולקרוא את העץ. עשר שניות לעומת כתיבת סקריפט PHP לזרוק.

הגירות הן הערמומיות. מחרוזות מסודרות מטמיעות אורכים משלהן, כך שמציאת והחלפה נאיבית ב-dump של מסד נתונים - נניח, החלפת דומיין ישן בחדש - משנה את תוכן המחרוזת מבלי לעדכן את קידומת האורך, וכל ערך מושפע הופך לבלתי ניתן להמשכה. הפענוח תחילה מראה לך בדיוק אילו ערכים נושאים את התחום כדי שתדע איזה חיפוש והחלפה רגילים ישברו. (הכלי הנכון להחלפה עצמו הוא WP-CLI's search-replace, שמבין בסידרה.)

לאחר מכן יש מטמון ובדיקת הפעלה - Redis, Memcached ומטמוני קבצים באפליקציות PHP מחזיקים לעתים קרובות ערכים מסודרים - וסקירת אבטחה, שבה אתה צריך לראות מה מאוחסן בפועל לפני שתוכל לשפוט אם זה בטוח.

האם פענוח נתונים מסודרים בדפדפן בטוח?

בטוח יותר מלעשות את זה ב-PHP, ושווה להבין למה.

PHP's מקורי unserialize() בעל היסטוריית אבטחה ארוכה. ניזון מחרוזת מעוצבת, הוא יכול ליצור אובייקטים שרירותיים ולהפעיל את שיטות הקסם שלהם (__wakeup, __destruct), אשר בתנאים הנכונים הופך להתקפת הזרקת אובייקט ובמקרה הרע, ביצוע קוד מרחוק. לכן העצה העומדת היא לעולם לא להתקשר unserialize() על קלט לא מהימן, וכדי לעבור ['allowed_classes' => false] כאשר אתה חייב.

כלי הדפדפן עוקף את כל זה כי הוא אף פעם לא ריצות PHP. הוא קורא את פורמט המחרוזת ומציג את המבנה - לא נוצרים אובייקטי PHP, אין שיטות קסם אש, ואין מתורגמן לנצל הנתונים גם נשארים במכשיר שלך; הוא מנותח באופן מקומי ולעולם לא נשלח לשרת, מה שחשוב כאשר הכתם המסודר הוא הפעלה או משהו אחר שאתה מעדיף לא להעלות. אז בשביל בדיקה נתונים מסודרים לא מהימנים, הדפדפן הוא באמת המקום הבטוח יותר.

Php מקורי unserialize() כלי דפדפן Toolz.dev
מייצא אובייקטים כן (סיכון הזרקה) לא - קורא מבנה בלבד
פועל על שרת כן לא - מקומי בדפדפן
בטוח בקלט לא מהימן רק עם allowed_classes כן, זה אף פעם לא מבצע
מטפל באורכים מרובי בתים נכון (בתים) לא אמין (יחידות קוד)
פותר הפניות לאובייקטים כן לא - הופעות [Reference]
מטרה שחזור ערכים חיים בדוק וקרא

הטבלה הזו היא גם סיכום כנה של הפשרה: כלי הדפדפן הוא הקורא הבטוח, לא תחליף טיפה לפונקציית השפה.

מהם המקורות הנפוצים בעולם האמיתי?

אם אתה כאן, זה כנראה אחד מאלה וורדפרס נשענת על serialization בכבדות ב wp_options - - widget_text, sidebars_widgets, theme_mods_*, רשימת התוספים הפעילים, לוחות זמנים של cron.WooCommerce מאחסנת וריאציות של מוצרים, תכונות ושדות מותאמים אישית כמטא של פוסטים מסודרים, וזו הסיבה שמוצר עם תמחור שגוי חוזר לעתים קרובות כל כך לערך מסודר. Laravel משתמש בסידרה עבור מטמון קבצים ואחסון הפעלה. Magento's מערכת התצורה מלאה בו. אותו פורמט בכל מקום; אותה גישת פענוח.

כמה דברים שהכלי לא עושה

שני גבולות כנים. זה לא פותר הפניות - PHP יכול להעלות מצביע בסידרה לערך מוקדם יותר (r: או R:), והכלי מציג את אלה כמילוליים [Reference] סמן במקום לעקוב אחריהם. וזה קורא, לא עורך: אין " שנה את הערך הזה והסרתי מחדש" מצב. כדי לשנות נתונים מסודרים, פענח אותם, בצע את השינוי שלך ב-PHP או ב-JSON, והסרתי מחדש בצד PHP. אם עליך לערוך ביד את המחרוזת הגולמית, זכור שעליך לתקן גם את קידומות האורך, ולפי הסעיף שלמעלה - לספור בתים, לא תווים.

שאלות נפוצות

למה משמשת סדרת PHP?

הוא ממיר ערכים מורכבים כמו מערכים ואובייקטים למחרוזת אחת שיכולה לחיות בעמודת מסד נתונים, קובץ או מטמון, ולהיבנות מחדש מאוחר יותר. WordPress, WooCommerce, Laravel ומג'נטו כולם משתמשים בו רבות עבור הגדרות, נתוני הפעלה וערכים מאוחסנים במטמון.

האם אני יכול לבטל את הסידרה של נתוני PHP ללא שרת PHP?

כן. ה בטל סדרה של הכלי מנתח PHP בסידרה ב-JavaScript בדפדפן שלך אין התקנת PHP, אין שרת, אין חשבון.

האם זה בטוח לפענח נתונים מסודרים בדפדפן?

כן, וזה בטוח יותר מאשר PHP's משלו unserialize() על קלט לא מהימן, כי הכלי קורא רק את מבנה המיתר. זה אף פעם לא יוצר אובייקטי PHP, אז התקפות שיטת הקסם שהופכות מקוריות unserialize() מסוכן פשוט לא יכול לקרות.

מדוע המחרוזת המסודרת שלי לא מצליחה לפענח?

הסיבות הרגילות הן עותק קטום (פספסת את הפלטה הנגררת או את התו הראשון), קידומת אורך שבורה לאחר איתור והחלפה, או נתונים שאינם למעשה PHP בסידרה. עוד אחד שתופס אנשים: אם המחרוזת מכילה תווים מודגשים, אימוג'י או טקסט CJK, הכלי ' ספירת אורך יחידת קוד יכולה לנתח אותו בצורה שגויה, מכיוון ש-PHP סופר את אורך המחרוזת בבתים והכלי סופר יחידות UTF-16.

האם אני יכול לפענח את ערכי wp_options של וורדפרס איתו?

כן - זה אחד השימושים הנפוצים ביותר. Query the option_value, הדבק אותו וקרא את המבנה. רק שים לב שאם האפשרות מכילה טקסט מרובה בתים, ייתכן שתצטרך WP-CLI בשרת במקום זאת.

האם אוכל לערוך נתונים מסודרים עם הכלי הזה?

לא, זה קורא לשנות ערך, לפענח אותו, לערוך ב PHP או JSON, ו מחדש serialize בצד PHP.עריכה ידנית המחרוזת הגולמית פירושה תיקון הקידומות באורך בתים בעצמך, אשר נוטה לשגיאות.

מה ההבדל בין PHP serialization ו JSON?

Serialization משמר סוגים ספציפיים ל-PHP, כולל שמות מחלקות אובייקטים ומאפיינים פרטיים. JSON הוא אגנוסטי לשפה ומכיר רק מחרוזות, מספרים, בוליאנים, null, מערכים ואובייקטים. קוד חדש מעדיף בדרך כלל JSON מכיוון json_decode() אינו יוצר אובייקטים, כך שהוא מונע את הסיכון בהזרקה, ו-JSON ניתן לקריאה בכל מקום. אתה יכול להעביר מבנה מפוענח לתוך פורמט JSON לעבוד עם זה ככה.

האם הכלי מטפל באובייקטים מסודרים, לא רק במערכים?

כן. אובייקטים מפענחים כששם המחלקה שלהם נשמר לצד המאפיינים, ומאפיינים פרטיים או מוגנים (ש-PHP מסדרת עם קידומות null-byte) מנוקים לשמות קריאים בפלט.

מסקנה

נתוני PHP מסודרים הם בלתי נמנעים אם אתה נוגע בוורדפרס, WooCommerce או Laravel, והיכולת לקרוא אותם לפי דרישה הופכת קטגוריה של באגים מתסכלים למהירים. ה בטל סדרה של הכלי עושה את זה בלשונית דפדפן, בבטחה, ללא שרת PHP - כל עוד אתה יודע את הקצה האמיתי היחיד שלו: מחרוזות מרובות בתים יכולות להכשיל את ספירת האורך, ונתוני ASCII הם המקום שבו הם זורחים. הדבק, קרא, תקן. וכשהנתונים מלאים בהדגשים או אימוג'י, פנה ל-WP-CLI במקום זאת.


כלים קשורים:

Comments

0 comments

0/2000 characters

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