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 များအားလုံးကိုစာရင်းပြုစုနိုင်သော်လည်းစာရင်းမလုံလောက်ပါ။
ZIP ဖိုင်များရှိ nested directories များသည်အမှန်တကယ်ဖိုင်စနစ်များကဲ့သို့သော "သစ်ပင်ကဲ့သို့သော" ဖွဲ့စည်းပုံမရှိပါ။ ဥပမာတစ်ခုချင်းစီကို directory သို့မဟုတ် file တစ်ခုစီကို path string တစ်ခုအဖြစ်ဖော်ပြထားသည်။
photos/
photos/vacation/
photos/vacation/beach.jpg
documents/report.docx
ထို့ကြောင့်ကျွန်ုပ်တို့သည် / အောက်ဖော်ပြပါဖိုင်လမ်းကြောင်း၏အတိမ်အနက်ကိုကျွန်ုပ်တို့ဆုံးဖြတ်ရန်လိုအပ်သည်။ အလွှာတစ်ခုစီကိုရိုးရှင်းသော exploit () ဖြင့်ခွဲခြမ်းစိတ်ဖြာနိုင်သည်။
$depth = substr_count($entryName, '/');
Directory Level နှင့်အညီကျွန်ုပ်တို့သည်တိကျသောစစ်ဆင်ရေးများကိုလုပ်ဆောင်ရန်လိုအပ်သည့်အခါ၎င်းသည်အလွန်အသုံးဝင်သည်။
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;
}
မလိုအပ်သောဖိုင်ဖတ်ရှုခြင်းကိုရှောင်ကြဉ်ပါ ။
0 ယ်လိုအားကိုတင်ရန် - ကြီးမားသောဖိုင်များအတွက်, Zip_entry_Read ($ entry ကို zip_entry_filesize) ကို တစ်ကြိမ်တွင်တင်ရန်မသုံးပါနှင့်။
အသုတ်စစ်ဆင်ရေး - နောက်ဆုံးစစ်ဆင်ရေးတွင်ဒေတာဘေ့စ်သို့မဟုတ်ပြင်ပဝန်ဆောင်မှုပါ 0 င်ပါကကြားခံရလဒ်ကိုစဉ်းစားပြီးအသုတ်တွင်တင်ပြပါ။
Zip fats fats zip_read () function ကိုအသုံးပြုခြင်းသည် Zip films files များပြုလုပ်ရန် ziparchive ကဲ့သို့မဟုတ်သော်လည်းသွေးတိုးရောဂါထိန်းချုပ်မှုလိုအပ်ချက်များမြင့်မားသောနေရာများတွင်အလွန်လက်တွေ့ကျဆဲဖြစ်သည်။ Path String ကိုဆန်းစစ်ခြင်းအားဖြင့်ကျွန်ုပ်တို့သည် layer layer nested directory များကိုထိရောက်စွာလုပ်ဆောင်နိုင်ပြီး contents များကို server-directator လမ်းကြောင်းသို့လုံခြုံစွာထုတ်ယူနိုင်သည်။ သင့်လျော်သောလုံခြုံရေးနှင့်စွမ်းဆောင်ရည်အကောင်းဆုံးအစီအမံများကိုပေါင်းစပ်ခြင်း, ဤချဉ်းကပ်မှုသည်ရှုပ်ထွေးသော Zip file processing logic တည်ဆောက်ရန်အတွက်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်နေဆဲပင်။