Command Palette

Search for a command to run...

PHP إلغاء التسلسل عبر الإنترنت: قراءة البيانات التسلسلية بدون خادم PHP

PHP إلغاء التسلسل عبر الإنترنت: قراءة البيانات التسلسلية بدون خادم PHP

T
Toolz Team
|Jul 10, 2026|13 دقيقة قراءة

جزء من مجموعة برمجة مطبوعة

التنسيق ليس له مواصفات خارج نطاق التنفيذ؛ ال دليل PHP ل unserialize() هو المرجع، ومن الواضح أن تمرير المدخلات غير الموثوق بها غير آمن.

المرة الأولى التي كلفتني فيها بيانات PHP المتسلسلة فترة ما بعد الظهر، كانت تذكرة دعم WP Adminify. لقد تعطلت إعدادات عناصر واجهة المستخدم الخاصة بلوحة المعلومات الخاصة بالمستخدم &#39؛ و&quot؛الإعدادات والاقتباس؛ كانوا يصفون يعيشون في wp_options الجدول كسلسلة متسلسلة واحدة تشبه ضوضاء الخط: a:4:{s:8:"_builtin";b:1;.... لم أتمكن من قراءتها، ولم أتمكن من معرفة الخطأ الذي حدث في لمحة سريعة، ولم أرغب في إنشاء بيئة PHP كاملة فقط print_r صف واحد. بعد ظهر ذلك اليوم هو سبب اهتمامي بوجود وحدة فك ترميز على بعد علامة تبويب متصفح واحدة.

إذا كنت تعمل في WordPress أو WooCommerce أو Laravel أو أي قاعدة تعليمات برمجية PHP قديمة، فقد استوفت البيانات المتسلسلة سواء أردت ذلك أم لا. ويظهر في جداول الخيارات وملفات الجلسة ومخازن ذاكرة التخزين المؤقت ونشر التعريف. وعندما ينقطع شيء ما، فإن القدرة على قراءته بسرعة هي الفرق بين الإصلاح لمدة خمس دقائق وبعد الظهر.

يغطي هذا الدليل التنسيق التسلسلي في الواقع، وكيفية فك تشفيره باستخدام إلغاء التسلسل أداة على Toolz.dev، والأهم من ذلك، القيد الحقيقي الوحيد الذي تحتاج إلى معرفته قبل أن تثق في مخرجات البيانات غير الإنجليزية.

ليرة تركية؛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 بإلغاء تسلسل الأداة بفك تشفيرها؟

تقوم بلصق السلسلة، وتقوم بتوزيع التنسيق مباشرة في 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";...} فك التشفير مع أ __class__ علامة "User" بالإضافة إلى خصائصه، حتى تتمكن من رؤية كل من النوع والبيانات. حتى أنه يتعامل مع الحالة المحرجة للخصائص الخاصة والمحمية، والتي تقوم PHP بتسلسلها باستخدام بادئات بايت فارغة حول اسم الفئة - تقوم الأداة بتجريدها وتظهر لك اسم الخاصية النظيفة.

يمكنك الحصول على ثمانية تنسيقات إخراج للتبديل بينها: Tree View، print_r، var_dump، var_export، كرومو، فاير بي إتش بي، ديبوج، وJSON عادي. أنا أعيش في Tree View للاستكشاف وJSON للنسخ إلى شيء آخر، ولكن إذا كانت ذاكرة عضلاتك متوقعة var_dump الإخراج، هو هناك.

القيد الوحيد الذي تحتاج إلى معرفته: السلاسل متعددة البايت

هذا هو الجزء الذي أريد أن يخبرني به أحد قبل أن أثق في وحدة فك التشفير فيما يتعلق ببيانات الإنتاج، لذا فهو هنا مقدمًا.

يقيس التنسيق المتسلسل PHP&#39؛ طول السلسلة بايت. الأداة تقيسه طول سلسلة جافا سكريبت، الذي يحسب وحدات كود UTF-16. بالنسبة لـ ASCII العادي، فإن هذه هي نفس الرقم، لذلك يتم فك تشفير البيانات الإنجليزية بشكل مثالي. في اللحظة التي تحتوي فيها السلسلة على حرف UTF-8 متعدد البايت، فإنها تتباعد.

خذ الكلمة &quot؛café.&quot؛ في UTF-8 &quot؛é&quot؛ هو اثنين بايت، لذلك يقوم 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.

النتيجة العملية: إذا كنت تقوم بتصحيح أخطاء خيارات WordPress التي تعتبر ASCII خالصة - معظم إعدادات المكونات الإضافية، slugs، العلامات المنطقية - فأنت بخير. إذا كانت البيانات المتسلسلة تحتوي على أسماء معلمة أو رموز تعبيرية أو نص CJK، فقد يؤدي فك التشفير إلى إتلاف أو خطأ، وهذا خطأ حقيقي في الأداة، وليس بياناتك. (بالنسبة للسجل، الإصلاح في نهايتنا هو التحليل بطول بايت UTF-8 بدلاً من ذلك .length؛ إنه موجود في قائمتي.) عندما تضغط عليه، فإن الأوامر المدركة للتسلسل WP-CLI&#39؛ الموجودة على الخادم هي البديل الموثوق به.

هناك تحذير لطيف ذو صلة: var_dump يقوم الإخراج بالإبلاغ عن أطوال السلسلة باستخدام نفس عدد وحدات التعليمات البرمجية، لذلك var_dump("café") عروض string(4) حيث سيقول PHP الحقيقي string(5)، ويظهر الرمز التعبيري طولًا لن يتطابق مع عدد بايت PHP&#39؛s أيضًا. اقرأ هذه الأرقام كـ &quot؛ طول JavaScript، &quot؛ ليس &quot؛ طول بايت PHP.&quot؛

لماذا تحتاج إلى إلغاء تسلسل البيانات خارج PHP؟

هناك الكثير من الأسباب، ولا يوجد أي منها تقريبًا &quot؛ للمتعة.&quot؛

تصحيح الأخطاء هو الكبير. يقول تقرير الأخطاء أن إعدادات المستخدم &#39؛ خاطئة؛ الإعدادات عبارة عن نقطة متسلسلة في قاعدة البيانات؛ لا يمكنك رؤية المشكلة حتى تقوم بفك تشفيرها. سير العمل الذي أستخدمه هو: SELECT option_value FROM wp_options WHERE option_name = 'widget_text';، انسخ النتيجة، والصقها في أداة إلغاء التسلسل، وقراءة الشجرة. عشر ثوانٍ مقابل كتابة نص PHP قابل للرمي.

عمليات الترحيل هي التسلل. تتضمن السلاسل المتسلسلة أطوالها الخاصة، لذا فإن البحث والاستبدال الساذج في تفريغ قاعدة البيانات - على سبيل المثال، تبديل مجال قديم بنطاق جديد - يغير محتوى السلسلة دون تحديث بادئة الطول، وتصبح كل قيمة متأثرة غير قابلة للتسلسل. يُظهر لك فك التشفير أولاً القيم التي تحمل المجال بالضبط حتى تعرف ما الذي سينكسره البحث والاستبدال العادي. (الأداة الصحيحة للاستبدال نفسه هي WP-CLI&#39؛s search-replace، الذي يفهم التسلسل.)

ثم هناك فحص ذاكرة التخزين المؤقت والجلسة - غالبًا ما تحتوي ذاكرة التخزين المؤقت Redis وMemcached وذاكرة التخزين المؤقت للملفات في تطبيقات PHP على قيم متسلسلة - ومراجعة الأمان، حيث تحتاج إلى رؤية ما تم تخزينه بالفعل قبل أن تتمكن من الحكم على ما إذا كان آمنًا.

هل فك تشفير البيانات المتسلسلة في المتصفح آمن؟

أكثر أمانًا من القيام بذلك في PHP، ويستحق فهم السبب.

PHP&#39؛s الأصلي unserialize() لديه تاريخ أمني طويل. تم تغذيته بسلسلة مصنوعة، ويمكنه إنشاء كائنات عشوائية وتشغيل أساليبها السحرية (__wakeup، __destruct)، والذي يصبح في ظل الظروف المناسبة هجومًا عن طريق حقن الأشياء، وفي أسوأ الأحوال، تنفيذ التعليمات البرمجية عن بعد. ولهذا السبب فإن النصيحة الدائمة هي عدم الاتصال أبدًا unserialize() على مدخلات غير موثوقة، والتمرير ['allowed_classes' => false] عندما يجب عليك.

أداة المتصفح تتجنب كل ذلك لأنها لا تتجنب ذلك أبدًا أشواط PHP. يقرأ تنسيق السلسلة ويعرض البنية - لا يتم إنشاء كائنات PHP، ولا يتم إطلاق أي أساليب سحرية، ولا يوجد مترجم لاستغلاله. تبقى البيانات أيضًا على جهازك؛ يتم تحليله محليًا ولا يتم إرساله أبدًا إلى الخادم، وهو أمر مهم عندما تكون النقطة المتسلسلة عبارة عن جلسة أو أي شيء آخر تفضل عدم تحميله. لذلك ل التفتيش البيانات المتسلسلة غير الموثوقة، المتصفح هو حقًا المكان الأكثر أمانًا.

Php الأصلي unserialize() أداة متصفح Toolz.dev
إنشاء مثيل للكائنات نعم (خطر الحقن) لا - يقرأ الهيكل فقط
يعمل على الخادم نعم لا - محلي في المتصفح
آمن على المدخلات غير الموثوقة فقط مع allowed_classes نعم، لا يتم تنفيذه أبدًا
يتعامل مع أطوال متعددة البايت بشكل صحيح (بايت) غير موثوق (وحدات الكود)
يحل مراجع الكائنات نعم لا - يظهر [Reference]
غرض إعادة بناء القيم الحية فحص وقراءة

يعد هذا الجدول أيضًا ملخصًا صادقًا للمقايضة: أداة المتصفح هي القارئ الآمن، وليست بديلاً مباشرًا لوظيفة اللغة.

ما هي مصادر العالم الحقيقي المشتركة؟

إذا كنت هنا، فمن المحتمل أن يكون واحدًا من هؤلاء. يعتمد WordPress على التسلسل بشكل كبير wp_options - widget_text، sidebars_widgets، theme_mods_*، قائمة المكونات الإضافية النشطة، وجداول cron. تقوم WooCommerce بتخزين اختلافات المنتج وسماته وحقوله المخصصة كنشرة تعريفية متسلسلة، ولهذا السبب غالبًا ما يعود المنتج ذو الأسعار الخاطئة إلى قيمة متسلسلة. يستخدم Laravel التسلسل لذاكرة التخزين المؤقت للملفات وتخزين الجلسة. نظام التكوين Magento&#39؛ مليء به. نفس التنسيق في كل مكان؛ نفس نهج فك التشفير.

بعض الأشياء التي لا تفعلها الأداة

حدان صادقان. لا يحل المراجع - يمكن لـ PHP إجراء تسلسل للمؤشر إلى قيمة سابقة (r: أو R:)، والأداة توضح ذلك كحرف [Reference] علامة بدلا من اتباعهم. وهو قارئ وليس محررًا: لا يوجد &quot؛ تغيير هذه القيمة وإعادة التسلسل والاقتباس؛ وضع. لتعديل البيانات المتسلسلة، وفك تشفيرها، وإجراء التغيير في PHP أو في JSON، وإعادة التسلسل على جانب PHP. إذا كان يجب عليك تحرير السلسلة الأولية يدويًا، فتذكر أنه يتعين عليك إصلاح بادئات الطول أيضًا، و- وفقًا للقسم أعلاه - عد البايتات، وليس الأحرف.

الأسئلة الشائعة

ما هي استخدامات تسلسل PHP؟

فهو يحول القيم المعقدة مثل المصفوفات والكائنات إلى سلسلة واحدة يمكن أن تعيش في عمود قاعدة بيانات أو ملف أو ذاكرة تخزين مؤقت، ويمكن إعادة بنائها لاحقًا. يستخدمه كل من WordPress وWooCommerce وLaravel وMagento بكثافة للإعدادات وبيانات الجلسة والقيم المخزنة مؤقتًا.

هل يمكنني إلغاء تسلسل بيانات PHP بدون خادم PHP؟

نعم. ال أداة إلغاء التسلسل يوزع PHP المتسلسل في JavaScript في متصفحك. لا يوجد تثبيت PHP، لا خادم، لا حساب.

هل من الآمن فك تشفير البيانات المتسلسلة في المتصفح؟

نعم، وهو أكثر أمانًا من PHP&#39؛s الخاصة unserialize() على الإدخال غير الموثوق به، لأن الأداة تقرأ بنية السلسلة فقط. فهو لا يقوم أبدًا بإنشاء كائنات PHP، وبالتالي فإن هجمات الطريقة السحرية هي التي تجعلها أصلية unserialize() ببساطة لا يمكن أن يحدث أمر خطير.

لماذا تفشل سلسلتي المتسلسلة في فك التشفير؟

الأسباب المعتادة هي نسخة مقطوعة (لقد فاتتك الأقواس اللاحقة أو الحرف الأول)، أو بادئة طول مكسورة بعد البحث والاستبدال، أو بيانات لم يتم تسلسلها فعليًا بواسطة PHP. وهناك سبب آخر يلفت انتباه الأشخاص: إذا كانت السلسلة تحتوي على أحرف معلمة أو رموز تعبيرية أو نص CJK، فإن حساب طول وحدة التعليمات البرمجية للأداة &#39؛s يمكن أن يخطئ في تحليلها، لأن PHP تحسب طول السلسلة بالبايت والأداة تحسب وحدات UTF-16.

هل يمكنني فك تشفير قيم WordPress wp_options باستخدامه؟

نعم - هذا هو أحد الاستخدامات الأكثر شيوعا. الاستعلام عن option_value، لصقها، وقراءة البنية. فقط انتبه إلى أنه إذا كان الخيار يحتوي على نص متعدد البايتات، فقد تحتاج إلى WP-CLI على الخادم بدلاً من ذلك.

هل يمكنني تحرير البيانات المتسلسلة باستخدام هذه الأداة؟

لا، إنه قارئ. لتغيير قيمة، وفك تشفيرها، وتحريرها في PHP أو JSON، وإعادة التسلسل على جانب PHP. تحرير السلسلة الأولية يدويًا يعني إصلاح بادئات طول البايت بنفسك، وهو أمر عرضة للخطأ.

ما الفرق بين تسلسل PHP وJSON؟

يحافظ التسلسل على الأنواع الخاصة بـ PHP، بما في ذلك أسماء فئات الكائنات والخصائص الخاصة. JSON لا يعرف اللغة ويعرف فقط السلاسل والأرقام والمنطقيات والفارغة والمصفوفات والكائنات. يفضل الكود الجديد عمومًا JSON لأنه json_decode() لا يقوم بإنشاء مثيل للكائنات، لذلك فهو يتجنب خطر الحقن، ويمكن قراءة JSON في كل مكان. يمكنك نقل بنية تم فك تشفيرها إلى تنسيق JSON للعمل معها بهذه الطريقة.

هل تتعامل الأداة مع الكائنات المتسلسلة، وليس المصفوفات فقط؟

نعم. يتم فك تشفير الكائنات مع الاحتفاظ باسم فئتها جنبًا إلى جنب مع الخصائص، ويتم تنظيف الخصائص الخاصة أو المحمية (التي تقوم PHP بتسلسلها باستخدام بادئات بايت فارغة) إلى أسماء قابلة للقراءة في الإخراج.

خاتمة

لا يمكن تجنب بيانات PHP المتسلسلة إذا لمست WordPress أو WooCommerce أو Laravel، كما أن القدرة على قراءتها عند الطلب تحول فئة من الأخطاء المحبطة إلى أخطاء سريعة. ال أداة إلغاء التسلسل هل يتم ذلك في علامة تبويب المتصفح، بأمان، بدون خادم PHP - طالما أنك تعرف حافتها الحقيقية الوحيدة: يمكن للسلاسل متعددة البايت أن تتعثر في حساب الطول، وبيانات ASCII هي المكان الذي تتألق فيه. لصق، اقرأ، أصلح. وعندما تكون البيانات مليئة باللهجات أو الرموز التعبيرية، يمكنك الوصول إلى WP-CLI بدلاً من ذلك.


الأدوات ذات الصلة:

Comments

0 comments

0/2000 characters

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