လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP တွင် Serialize နှင့် unserialize အတွက်ကျွမ်းကျင်မှုများကိုမှားယွင်းစွာချခြင်း

PHP တွင် Serialize နှင့် unserialize အတွက်ကျွမ်းကျင်မှုများကိုမှားယွင်းစွာချခြင်း

gitbox 2025-05-28

PHP တွင် Serialize နှင့် unserialize function များကိုများသောအားဖြင့် PHP variable များကို strings များနှင့်စတိုးဆိုင်များသို့ပြောင်းရွှေ့ရန်အသုံးပြုလေ့ရှိသည်။ နှစ် ဦး စလုံးသည်ဖွံ့ဖြိုးတိုးတက်မှုလုပ်ငန်းစဉ်တွင်အလွန်အသုံးဝင်သော်လည်းအခက်အခဲများရှာဖွေရန်ခက်ခဲသောအမှားအယွင်းများကိုလည်းမိတ်ဆက်ပေးနိုင်သည်။ ဤအမှားများကို debging လုပ်သည့်အခါပြ the နာကိုရှာဖွေရန်အတွက်အကြံပြုချက်များလိုအပ်သည်။ ဤဆောင်းပါးသည်အများအားဖြင့်အမှားအယွင်းများနှင့်သူတို့၏ဖြေရှင်းနည်းများကိုမိတ်ဆက်ပေးပြီးဤလုပ်ဆောင်မှုများကိုထိရောက်စွာမည်သို့ debug လုပ်နည်းကိုလမ်းညွှန်ပေးမည်နည်း။

1 ။ ဘုံအမှားများ - Serial ဒေတာပုံစံမမှန်ကန်ပါ

Serialize function သည် PHP variable ကို string တစ်ခုသို့ပြောင်းလဲသည်။ ၎င်းသည် unserialize function မှတစ်ဆင့်မူလ PHP variable ကိုပြန်ယူနိုင်သည်။ အကယ် . Serialize မမှန်ကန်ပါကအချက်အလက်များသည်မမှန်ကန်ပါက,

အမှားဥပမာ -

 $myData = array('name' => 'John', 'age' => 30);
$serializedData = serialize($myData);

// serialized ဒေတာနှင့်အတူကိုယ်တိုင် tamper
$serializedData = substr($serializedData, 0, 20);

$unserializedData = unserialize($serializedData);

အဆင့်ဆင့် -

  1. ဒေတာသမာဓိကိုစစ်ဆေးပါ

  2. မှတ်တမ်းတင် ခြင်း နှင့်မှတ်တမ်းတင်ခြင်းမှတ်တမ်းတင်ခြင်း

 var_dump($serializedData);

ဖြေရှင်းချက် -

  • အကယ်. serialized data ကိုမမျှော်လင့်ဘဲပြုပြင်မွမ်းမံပါကအချက်အလက်များ၏သမာဓိကိုမှန်ကန်စွာအတည်ပြုခြင်းနှင့်အတည်ပြုခြင်းအားဖြင့် (ထိုကဲ့သို့သော hash (သို့) checksum သုံးခြင်း) ကိုအတည်ပြုခြင်းနှင့်အတည်ပြုခြင်းဖြင့်သေချာစစ်ဆေးနိုင်သည်။

2 ။ data အမျိုးအစား deserialization ပြီးနောက်အမှားအယွင်း

unserialize ကို အသုံးပြုသောအခါ, မမျှော်လင့်သောဒေတာအမျိုးအစားများပေါ်လာနိုင်သည်။ ဥပမာအားဖြင့်, serialized အရာဝတ်ထုသည် မလုံလောက်သည့် အခါ တရားမဝင်သော သို့မဟုတ်မမှန်ကန်သောအမျိုးအစားတန်ဖိုးကိုမှန်ကန်စွာမတင်ပါက,

အမှားဥပမာ -

 class User {
    public $name;
}

$serializedData = serialize(new User());
$unserializedData = unserialize($serializedData);

var_dump($unserializedData); // ဖြစ်လိမ့်မည်ဟုမျှော်လင့်ရသည် User ကန့်ကွက်,ဒါပေမယ့်ပြန်လာလိမ့်မည် NULL

အဆင့်ဆင့် -

  1. Class ကိုဖွင့်သည်ကိုစစ်ဆေးပါ ။ အရာဝတ်ထုတစ်ခုကို deserializing ပြ problems နာများကိုသင်ကြုံတွေ့ရပါကသက်ဆိုင်ရာလူတန်းစားကိုတင်မနေစစ်ဆေးပါ။

  2. class_exists () နှင့် method_exists () နှင့် method_exists () - deserialized class ကို PHP တွင်သတ်မှတ်ပြီးမှန်ကန်စွာချက်ချင်းပြုလုပ်နိုင်ပါ။

 if (!class_exists('User')) {
    echo "အမျိုးအစား User undefined";
} else {
    $unserializedData = unserialize($serializedData);
    var_dump($unserializedData);
}

ဖြေရှင်းချက် -

  • deserialized အရာဝတ်ထု၏အတန်းကို SPL_Autoload_register () ကို အသုံးပြု. မှန်ကန်စွာသို့မဟုတ် dynamically loaded လုပ်ထားကြောင်းသေချာအောင်လုပ်ပါ။

  • PHP 5.3 နှင့်အထက်တွင်လုံခြုံရေးကိုမြှင့်တင်ရန် deserialized အတန်းများကို ကန့်သတ်ရန် အဆင်သင့် () function ၏ဒုတိယ pareter ကိုသုံးနိုင်သည်။

 $unserializedData = unserialize($serializedData, ["allowed_classes" => ["User"]]);

3 ။ deserialization ကာလအတွင်းလုံခြုံရေးပြ issues နာများ

deserialization စစ်ဆင်ရေးများတွင်လုံခြုံရေးအန္တရာယ်များရှိသည်။ တိုက်ခိုက်သူသည် serialized data များနှင့်အနှောင့်အယှက်ပေးခြင်းဖြင့်အန္တရာယ်ရှိသောကုဒ်ကိုလုပ်ဆောင်ရန်ကြိုးစားနိုင်သည်။

အမှားဥပမာ -

 $maliciousData = 'O:4:"User":1:{s:4:"name";s:4:"evil";}';
$unserializedData = unserialize($maliciousData);

အဆင့်ဆင့် -

  1. ဒေတာရင်းမြစ်များကိုစစ်ဆေးပါ ။ ဒေတာအရင်းအမြစ်အရင်းအမြစ်ကိုအမြဲတမ်းစစ်ဆေးပါ။

  2. Whitelististing ယန္တရားကိုသုံးပါ

ဖြေရှင်းချက် -

  • ခွင့်မပြုသည့်အတန်းများကိုစွန့်ခွာရန် ခွင့်ပြုထားသော uneerialize parametere () parametere ကိုသုံးပါ။

  • Data Descriptions ကို deservialization တိုက်ခိုက်မှုအန္တရာယ်ကိုလျှော့ချရန် Serial လွှဲပြောင်းမည့်အစားအချက်အလက်လွှဲပြောင်းမှုအတွက် JSO Format ကိုအသုံးပြုရန်စဉ်းစားပါ။

 $unserializedData = unserialize($maliciousData, ["allowed_classes" => ["User"]]);

4 ။ serialize နှင့် unserialize အမှားများကို debugging များအတွက်ဘုံကိရိယာများ

ဖွံ့ဖြိုးတိုးတက်မှုကာလအတွင်း Serialize နှင့် unserialize လုပ်ဆောင်မှုများတွင် debug ပြ problems နာများကိုကူညီရန်အသုံးပြုနိုင်သည့်ကိရိယာများနှင့်လှည့်ကွက်များရှိသည်။

Tool 1: သစ်ထုတ်လုပ်မှုကိုသုံးပါ

Serial data များကို log file တစ်ခုထဲသို့ logging လုပ်ခြင်းအားဖြင့်တစ်ခုခုမှားယွင်းသောအခါမူရင်းအချက်အလက်များကိုပြန်လည်ကြည့်ရှုနိုင်သည်။

 file_put_contents('serialize_log.txt', $serializedData . PHP_EOL, FILE_APPEND);

Tool 2: ယူနစ်စမ်းသပ်ခြင်း

ဒေတာများကိုမှန်ကန်စွာလည်ပတ်နိုင်ပြီးခြွင်းချက်များမရှိသေးစေရန် serialization နှင့် deserialization-related code များအတွက်ယူနစ်စစ်ဆေးမှုများရေးရန်ရေးပါ။

 public function testSerialization() {
    $data = array('name' => 'John', 'age' => 30);
    $serializedData = serialize($data);
    $this->assertNotEmpty($serializedData);

    $unserializedData = unserialize($serializedData);
    $this->assertEquals($data, $unserializedData);
}

Tool 3: PHP Built-in function var_dump

Var_Dump သည် အားကြီးသော debugging tool သည်ပြ problems နာများကိုလျင်မြန်စွာဖော်ထုတ်နိုင်အောင်ကူညီပေးနိုင်သည့်အသေးစိတ်အမျိုးအစားများနှင့်အကြောင်းအရာများကိုပြသနိုင်သည့်အစွမ်းထက် debugging tool တစ်ခုဖြစ်သည်။

 var_dump($unserializedData);

5 ။ အကျဉ်းချုပ်

အမှားအယွင်းများကို Serialize နှင့် unserialize လုပ်ဆောင်မှုများတွင်ပြ the နာကိုလေ့လာရန်လိုသည်။ အချက်အလက်များအရဒေတာပုံစံများကိုမှန်ကန်စွာဖွင့်လှစ်ထားသည်ဖြစ်စေ,

PHP တွင် Serialize နှင့် unserialize ကို ကိုင်တွယ်ရာတွင်ဤဆောင်းပါးသည်သင့်အားပိုမိုအသုံးဝင်စေရန်သင့်အားပိုမိုအသုံးဝင်စေရန်သင့်အားပိုမိုအသုံးဝင်စေရန်ကူညီပေးပါ။