လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Zip_read () function ကို သုံး. Multi-Layered Directory များပါ 0 င်သည့် Zip compressed packages များကိုထိရောက်စွာလုပ်ဆောင်နိုင်ပါသလား။

Zip_read () function ကို သုံး. Multi-Layered Directory များပါ 0 င်သည့် Zip compressed packages များကိုထိရောက်စွာလုပ်ဆောင်နိုင်ပါသလား။

M66 2025-06-15

PHP ရှိ Zip ဖိုင်များနှင့်အလုပ်လုပ်ခြင်းသည်အထူးသဖြင့်အကြောင်းအရာများကိုဖြိုခွဲရန်သို့မဟုတ် compressed package မှဖိုင်ဖွဲ့စည်းပုံများကိုဖတ်ရန်လိုအပ်သည်။ Zip_read () function သည် Ziparchive class ပြင်ပရှိ Zip ဖိုင်များကိုလုပ်ဆောင်ရန်နောက်ထပ်နည်းလမ်းတစ်ခုဖြစ်သည်။ ၎င်းကို zip_open () နှင့် zip_entry_read ကဲ့သို့သောလုပ်ဆောင်ချက်များကိုမကြာခဏအသုံးပြုလေ့ရှိသည်။ ဤလုပ်ဆောင်ချက်များသည်အဆင့်နိမ့်သော်လည်း၎င်းတို့တွင်ဇစ်ဖိုင်ဖွဲ့စည်းပုံကိုပိုမိုနက်ရှိုင်းစွာဆုပ်ကိုင်ထားလိုသော developer များအတွက်အလွန်အရေးပါမှုကိုများစွာအရေးပါသည်။

အခြေခံအသုံးပြုမှုနည်းလမ်း

ပထမ ဦး စွာကျွန်ုပ်တို့သည် Zip_open () နှင့် zip_read သုံး. entry တစ်ခုစီမှတစ်ဆင့် zip ဖိုင်ကိုဖွင့်ရန်လိုအပ်သည်။ အောက်ဖော်ပြပါသည်အခြေခံဖွဲ့စည်းပုံဖြစ်သည်။

 $zip = zip_open("nested_directories.zip");

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $entryName = zip_entry_name($entry);
        echo "Entry: $entryName\n";
    }
    zip_close($zip);
}

ဤကုဒ်နံပါတ်သည် zip file ထဲတွင် (လမ်းညွှန်များအပါအ 0 င်လမ်းညွှန်များနှင့်ဖိုင်များအပါအ 0 င်) entries များအားလုံးကိုစာရင်းပြုစုနိုင်သော်လည်းစာရင်းမလုံလောက်ပါ။

အသိုက် directory structures ကိုခွဲခြားသတ်မှတ်

ZIP ဖိုင်များရှိ nested directories များသည်အမှန်တကယ်ဖိုင်စနစ်များကဲ့သို့သော "သစ်ပင်ကဲ့သို့သော" ဖွဲ့စည်းပုံမရှိပါ။ ဥပမာတစ်ခုချင်းစီကို directory သို့မဟုတ် file တစ်ခုစီကို path string တစ်ခုအဖြစ်ဖော်ပြထားသည်။

 photos/
photos/vacation/
photos/vacation/beach.jpg
documents/report.docx

ထို့ကြောင့်ကျွန်ုပ်တို့သည် / အောက်ဖော်ပြပါဖိုင်လမ်းကြောင်း၏အတိမ်အနက်ကိုကျွန်ုပ်တို့ဆုံးဖြတ်ရန်လိုအပ်သည်။ အလွှာတစ်ခုစီကိုရိုးရှင်းသော exploit () ဖြင့်ခွဲခြမ်းစိတ်ဖြာနိုင်သည်။

 $depth = substr_count($entryName, '/');

Directory Level နှင့်အညီကျွန်ုပ်တို့သည်တိကျသောစစ်ဆင်ရေးများကိုလုပ်ဆောင်ရန်လိုအပ်သည့်အခါ၎င်းသည်အလွန်အသုံးဝင်သည်။

ဖိုင်များကိုထုတ်ယူပြီး directory ဖွဲ့စည်းပုံကိုထိန်းသိမ်းပါ

Zip file ၏ contents ၏ contents ကိုသတ်မှတ်ထားသောလမ်းညွှန်တစ်ခုသို့ဖြည်ချရန်နှင့်၎င်း၏လမ်းညွှန်ဖွဲ့စည်းပုံကိုထိန်းသိမ်းရန်ကျွန်ုပ်တို့သည် Zip_entry_Read () နှင့် File_Proad () နှင့် File_Proad_contents နှင့်ပေါင်းစပ်။ အသုံးပြုနိုင်သည်။ အောက်တွင်ပြထားတဲ့အတိုင်း:

 $zip = zip_open("nested_directories.zip");

$extractPath = "extracted/";

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        if (zip_entry_open($zip, $entry, "r")) {
            $entryName = zip_entry_name($entry);
            $fullPath = $extractPath . $entryName;

            // ဒါကြောင့် directory လျှင်,ဖန်တီးရန်သေချာပါစေ
            if (substr($entryName, -1) === '/') {
                if (!is_dir($fullPath)) {
                    mkdir($fullPath, 0755, true);
                }
            } else {
                // ဖိုင်တစ်ခုပါ,ယခင် directory တည်ရှိသေချာပါစေ
                $dir = dirname($fullPath);
                if (!is_dir($dir)) {
                    mkdir($dir, 0755, true);
                }

                $content = zip_entry_read($entry, zip_entry_filesize($entry));
                file_put_contents($fullPath, $content);
            }

            zip_entry_close($entry);
        }
    }
    zip_close($zip);
}

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

လက်တွေ့ကျသောလျှောက်လွှာဥပမာ

Zip upload function ကို function ကိုပေးရန် https://m66.net/upload ကဲ့သို့သော 0 က်ဘ်ဆိုက်တစ်ခုကိုတီထွင်ခဲ့သည်ဆိုပါစို့။ အသုံးပြုသူများမှတင်ထားသော Zip file တွင်ရှုပ်ထွေးသော Multi-layer directory များပါ 0 င်နိုင်သည်။ ဤဖိုင်များကိုထပ်မံပြုပြင်ခြင်းအတွက်ယာယီလမ်းညွှန်တစ်ခုသို့လုံခြုံစွာ decompress လုပ်နိုင်ရန်အတွက်ယာယီ directory ထဲသို့ယာယီ directory ထဲသို့ယာယီ directory ထဲသို့သုံးရန်, အထက်ပါကုဒ်နှင့်အကြောင်းအရာကိုပထမဆုံးထုတ်ယူနိုင်ပြီး,

လမ်းကြောင်းဖြတ်သန်းမှုလမ်းကြောင်းကိုရှောင်ရှားရန် (ထိုကဲ့သို့သောအန္တရာယ်ရှိသော zip ကဲ့သို့သော zip ကဲ့သို့သော) ကိုရှောင်ရှားရန်, Path Stitching ပြီးနောက်လုံခြုံရေးစစ်ဆေးမှုကိုသင်လုပ်ဆောင်သင့်သည်

 $realBase = realpath($extractPath);
$realUserPath = realpath($fullPath);

if (strpos($realUserPath, $realBase) !== 0) {
    // တရားမဝင်လမ်းကြောင်း,ခုန်ကျော်သည်
    continue;
}

စွမ်းဆောင်ရည် optimization အကြံပြုချက်များ

  1. မလိုအပ်သောဖိုင်ဖတ်ရှုခြင်းကိုရှောင်ကြဉ်ပါ

  2. 0 ယ်လိုအားကိုတင်ရန် - ကြီးမားသောဖိုင်များအတွက်, Zip_entry_Read ($ entry ကို zip_entry_filesize) ကို တစ်ကြိမ်တွင်တင်ရန်မသုံးပါနှင့်။

  3. အသုတ်စစ်ဆင်ရေး - နောက်ဆုံးစစ်ဆင်ရေးတွင်ဒေတာဘေ့စ်သို့မဟုတ်ပြင်ပဝန်ဆောင်မှုပါ 0 င်ပါကကြားခံရလဒ်ကိုစဉ်းစားပြီးအသုတ်တွင်တင်ပြပါ။

အကျဉ်းချုပ်

Zip fats fats zip_read () function ကိုအသုံးပြုခြင်းသည် Zip films files များပြုလုပ်ရန် ziparchive ကဲ့သို့မဟုတ်သော်လည်းသွေးတိုးရောဂါထိန်းချုပ်မှုလိုအပ်ချက်များမြင့်မားသောနေရာများတွင်အလွန်လက်တွေ့ကျဆဲဖြစ်သည်။ Path String ကိုဆန်းစစ်ခြင်းအားဖြင့်ကျွန်ုပ်တို့သည် layer layer nested directory များကိုထိရောက်စွာလုပ်ဆောင်နိုင်ပြီး contents များကို server-directator လမ်းကြောင်းသို့လုံခြုံစွာထုတ်ယူနိုင်သည်။ သင့်လျော်သောလုံခြုံရေးနှင့်စွမ်းဆောင်ရည်အကောင်းဆုံးအစီအမံများကိုပေါင်းစပ်ခြင်း, ဤချဉ်းကပ်မှုသည်ရှုပ်ထွေးသော Zip file processing logic တည်ဆောက်ရန်အတွက်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်နေဆဲပင်။