انتقل إلى محتوى الدرس

Securing unserialize with allowed_classes حماية فك التسلسل بالخيار allowed_classes ضد الثغرات

أنشئ كائنات فورية عبر new class، وخزّن الكائنات بأمان عبر __serialize و__unserialize، وافحص الأصناف والدوال في وقت التشغيل.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

لا تمرر أبداً بيانات خارجية غير موثوقة إلى unserialize() دون تقييد الخيار allowed_classes، لمنع ثغرات حقن الكائنات (PHP Object Injection).

  • مرّر الخيار ['allowed_classes' => [SafeDto::class]] كمعامل ثانٍ للدالة unserialize() لحصر فك التسلسل في الأصناف المسموحة فقط.
  • مرّر ['allowed_classes' => false] لمنع إنشاء أي كائنات إطلاقاً، فيتحول أي كائن غير مصرح به إلى __PHP_Incomplete_Class غير قابل للتنفيذ.
  • عند تبادل البيانات مع المتصفح أو الكوكيز أو واجهات API الخارجية، استخدم json_encode() وjson_decode() بدلاً من serialize().

لأن الصنف DangerExec غير موجود في القائمة البيضاء allowed_classes، يرفض PHP إنشاءه ويحوله إلى __PHP_Incomplete_Class آمن.

PHP
<?php
class SafeCart { public string $sku = "KB-90"; }
class DangerExec { public string $cmd = "rm"; }

$payload = serialize(new DangerExec());
$res = unserialize($payload, ["allowed_classes" => [SafeCart::class]]);

echo get_debug_type($res) . "\n";