လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> XML_Parse တွင် XML DTD ကြေငြာချက်များမည်သို့ခွဲခြမ်းစိတ်ဖြာနည်း

XML_Parse တွင် XML DTD ကြေငြာချက်များမည်သို့ခွဲခြမ်းစိတ်ဖြာနည်း

M66 2025-04-28

PHP တွင် XML_Parse () သည် Expat စာကြည့်တိုက်ကိုအသုံးပြုသောဖြစ်ရပ် - မောင်းနှင် XML parser function တစ်ခုဖြစ်သည်။ ဤခွဲခြမ်းစိတ်ဖြာသည် SAX (XML အတွက်ရိုးရှင်းသော API အတွက်ရိုးရှင်းသော API) parser နှင့်ဆင်တူသည်။

သို့သော် XML_Parse () သည် DTD တွင်အသေးစိတ်ဖွဲ့စည်းပုံကိုအလိုအလျောက်မခွဲပါ (DOMC အမျိုးအစားနှင့်အဓိပ္ပါယ်ဖွင့်ဆိုချက်) ကိုအလိုအလျောက်မခွဲပါ။ သို့သော်၎င်းသည်သင့်လျော်သော callback လုပ်ဆောင်ချက်များကိုသတ်မှတ်ခြင်းဖြင့် DTD ကိုဖော်ထုတ်ရန်နှင့် DTD ကိုဖော်ထုတ်ရန်တောင်းဆိုသည့်အခါပြန်လည်ခေါ်ဆိုမှုကိုဖြစ်ပေါ်စေသည်။

1 ။ အဘယ်ကြောင့် DTD နှင့်အတူကိုင်တွယ်?

DTD ကြေငြာချက်သည် XML document တွင်ခွင့်ပြုထားသောဖွဲ့စည်းပုံနှင့် element အမျိုးအစားများကိုသတ်မှတ်သည်။ လုံခြုံရေးနှင့်ဒေတာစိစစ်အတည်ပြုမှုတို့တွင်အလွန်အရေးကြီးသည်။ အချို့သောအခြေအနေများတွင် XML ကိုခွဲခြမ်းစိတ်ဖြာခြင်း (သို့) DTD နှင့်အတူ XML နှင့်အတူ XML ကိုငြင်းပယ်သောအခါ၎င်းတွင်ပါရှိသော DTD ကိုခွဲခြားသတ်မှတ်လိုပေမည်။

2 ။ parser နှင့် callback function ကိုသတ်မှတ်ပါ

ဤတွင် XML_Parser_Create () နှင့် xml_parse () နှင့် DTD ကိုဖမ်းယူခြင်း၏ဥပမာတစ်ခုဖြစ်သည်။

 <?php

$xmlString = <<<XML
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://m66.net/dtd/note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
XML;

// ဖန်တီး XML မိစ်ဆာ
$parser = xml_parser_create();

// ညွှန်ကြားချက်များအတွက်ခေါ်ဆိုမှု function ကိုသတ်မှတ်ပါ(အပြောင်းအလဲနဲ့အဘို့ DTD ကြေငြာချက်စသည်)
function handle_processing_instruction($parser, $target, $data) {
    echo "processing command ကိုပစ်မှတ်: $target\n";
    echo "လုပ်ငန်းစဉ်ညွှန်ကြားချက်ဒေတာ: $data\n";
}

// default processing function ကိုသတ်မှတ်ပါ
function handle_default($parser, $data) {
    if (preg_match('/^<!DOCTYPE/i', trim($data))) {
        echo "ရှာဖွေတွေ့ရှိ DTD အသေအချာပေြာဆိုချက်: $data\n";
    }
}

// CallBack function ကိုခညျြနှောငျ
xml_set_processing_instruction_handler($parser, "handle_processing_instruction");
xml_set_default_handler($parser, "handle_default");

// ခွဲခြမ်းစိတ်ဖြာစတင်ပါ
if (!xml_parse($parser, $xmlString, true)) {
    die(sprintf(
        "XML အမှား: %s အတွက် %d အိုကေ",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)
    ));
}

// အရင်းအမြစ်များကိုအခမဲ့
xml_parser_free($parser);
?>

3 ။ ကုဒ်ဖော်ပြချက်

  1. Mandl_Processing_instruction_instruction_instruction ကို <? xml ... နှင့်အခြားအပြောင်းအလဲနဲ့ညွှန်ကြားချက်များနှင့်အခြားအပြောင်းအလဲနဲ့ညွှန်ကြားချက်များ

  2. Handled_Default သည်အခြားပရိုဆက်ဆာများကကြားဖြတ်မကြားဖူးသောကုန်ကြမ်းအချက်အလက်အများစုကိုသိမ်းယူရန်အသုံးပြုနိုင်သည့်ပိုမိုသောအခြေခံပရိုဆက်ဆာဖြစ်သည်။ <! DOCTTYPE> ကြေငြာချက်ရှိမရှိစစ်ဆေးရန်၎င်းကိုကျွန်ုပ်တို့အသုံးပြုသည်။

  3. Preg_match (/ ^ <!) string သည် DTD ကြေငြာချက်ဟုတ်မဟုတ်ဆုံးဖြတ်ရန် (/ ^ <! DOCTYPE / i ', $ ဒေတာ) ကို သုံးပါ။

4 ။ ဖြည့်စွက်မှတ်စု: xxe တိုက်ခိုက်မှုတားဆီး

XML parsers များကိုအသုံးပြုသောအခါ XXE (XML ပြင်ပ Entity Intimity Intement) တိုက်ခိုက်မှုများကိုကာကွယ်ရန်သတိထားပါ။ XML_Parse () ကိုယ်နှိုက်သည် Entity Entity (Expat သည်လုံခြုံစိတ်ချရမှု) ကိုမထောက်ပံ့ပါ။

 libxml_disable_entity_loader(true);

PHP 8.0+ တွင် libxml_disable_entity_entity_Omentity_Eloper_loader () ကိုကန့်ကွက်သည်။ သို့သော်ပုံမှန်အပြုအမူသည်ပိတ်ထားပြီးဖြစ်သည်။

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

  • XML_Parse () သူ့ဟာသူသည် DTD ၏ဖွဲ့စည်းတည်ဆောက်ပုံအကြောင်းအရာကိုဆန်းစစ်မထားပေ။

  • မထင်မှတ်သောရင်းမြစ်များမှ XML နှင့်ဆက်ဆံရာတွင်လုံခြုံရေးအားနည်းချက်များကိုကာကွယ်ရန် DTD နှင့် EVE Extensions ကိုသတိထားပါ။

  • ဝေးလံခေါင်သီသော DTD ကိုးကားထားသော URL များအားလုံးကိုစစ်ဆေးရန်အတွက် ( M66.net ကဲ့သို့သော) စိတ်ကြိုက်ဒိုမိန်းအမည်များဖြင့်အစားထိုးနိုင်သည်။

အထက်ဖော်ပြပါနည်းလမ်းဖြင့်သင်သည် XML_Parse () ကို သုံး. XML တွင် DTD ကြေငြာချက်များကိုပိုမိုပြောင်းလွယ်ပြင်လွယ်ရှိစေရန်နှင့်လုပ်ငန်းစဉ်ကိုရှာဖွေရန်နှင့်လုပ်ငန်းစဉ်ကိုသုံးနိုင်သည်။