လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP SymLink function ကိုအသုံးပြုသောအခါဖိုင်ခွင့်ပြုချက်ပြ issues နာများကိုမည်သို့ရှောင်ရှားရမည်နည်း

PHP SymLink function ကိုအသုံးပြုသောအခါဖိုင်ခွင့်ပြုချက်ပြ issues နာများကိုမည်သို့ရှောင်ရှားရမည်နည်း

gitbox 2025-05-26

PHP တွင် Symlink () function သည် developer များက developer များက developer များက developer များကိုဖန်တီးရန်ခွင့်ပြုသည်။ သို့သော်, အခြေခံဖိုင်စနစ်၏လုပ်ငန်းလည်ပတ်မှုသဘောသဘာဝကြောင့်မတော်လျော်စွာအသုံးပြုပါကခွင့်ပြုချက်ပြ problems နာများနှင့်လုံခြုံရေးဆိုင်ရာအန္တရာယ်များကိုဖြစ်စေရန်လွယ်ကူသည်။

ဤဆောင်းပါးသည် Symlink () Symlink () ကို လက်တွေ့ကျသော application များ၏ရှုထောင့်မှကြည့်ရှုသည့်အခါ Pymlink () ၏ရှုထောင့်မှကြည့်ရှုသောအခါဘုံခွင့်ပြုချက်ပြ Proble နာများနှင့်ဖြေရှင်းနည်းများအပေါ်နက်ရှိုင်းသောဆွေးနွေးမှုများပြုလုပ်မည်ဖြစ်သည်။

1 ။ အခြေခံအသုံးပြုမှုကိုပြန်လည်သုံးသပ်

 $target = '/var/www/html/data/original.txt';
$link = '/var/www/html/data/link.txt';

if (symlink($target, $link)) {
    echo 'သင်္ကေတ link ဖန်တီးမှုကိုအောင်မြင်စွာ。';
} else {
    echo 'သင်္ကေတ link ကိုဖန်တီးရန်ပျက်ကွက်。';
}

အသုံးပြုမှုသည်ရိုးရှင်းပြီးရှင်းလင်းသော်လည်း developer များသည်အမှန်တကယ်ဖြန့်ကျက်မှုတွင်အောက်ပါပြ problems နာများကိုမကြာခဏကြုံတွေ့ရလေ့ရှိသည်။


2 ။ ဘုံခွင့်ပြုချက်ပြ problems နာများနှင့်၎င်းတို့၏အကြောင်းပြချက်

1 ။ ခွင့်ပြုချက်မလုံလောက်ပါ

အသုံးအများဆုံးပြ problem နာမှာ Symlink () အမှားသတိပေးချက်များမရှိဘဲ မှားယွင်းသော ပြန်လာခြင်းဖြစ်သည်။ အဓိကအကြောင်းအရင်းမှာများသောအားဖြင့်ဖြစ်သည်။

  • PHP script execution အသုံးပြုသူ (ထိုကဲ့သို့သော www-data ကဲ့သို့) သည်ပစ်မှတ်ထားဖိုင်သို့မဟုတ်၎င်း၏သာလွန်လမ်းညွှန်အတွက်သင့်လျော်သောခွင့်ပြုချက်မရှိပါ။

  • အချို့သောစနစ်များ (အထူးသဖြင့် Selinux-Enabled Linux Systems) သည် Symlink () ၏အပြုအမူကိုကန့်သတ်ထားသည်။

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

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

  • PHP အသုံးပြုသူများသည် "Execution" နှင့် "ရေး" ခွင့်ပြုချက်များကိုပစ်မှတ်လမ်းကြောင်းသို့သွားပါ။

  • Linux တွင်ခွင့်ပြုချက်ကိုပြုပြင်ရန်အောက်ပါ command ကိုသုံးနိုင်သည်။

 sudo chown -R www-data:www-data /var/www/html/data
sudo chmod -R 755 /var/www/html/data
  • Selinux status ကိုစစ်ဆေးပြီးသက်ဆိုင်ရာမူဝါဒကိုစစ်ဆေးပါ ( setsebool -p httpd_homedirs ) ။

  • Developer Mode ကို Windows တွင်ဖွင့်ပါသို့မဟုတ် PHP ကိုအုပ်ချုပ်ရေးမှူးအဖြစ်လုပ်ကိုင်ပါ။


3 ။ ခွင့်ပြုချက်ပြ problems နာများကိုရှောင်ရှားရန်လက်တွေ့ကျွမ်းကျင်မှု

1 ။ Execution ပတ် 0 န်းကျင်ဆိုင်ရာခွင့်ပြုချက်ကိုဆုံးဖြတ်ရန်

Commlink () မျက်စိကန်းသောကွပ်မျက်ခြင်းကိုရှောင်ရှားရန်မခေါ်မီခွင့်ပြုချက်ကိုစစ်ဆေးပါ။

 if (is_writable(dirname($link)) && is_readable($target)) {
    symlink($target, $link);
} else {
    error_log('လုံလောက်သောခွင့်ပြုချက်မရှိဘဲသင်္ကေတ links ဖန်တီးပါ');
}

2 ။ လမ်းကြောင်းအမှားများကိုကာကွယ်ရန် realath နှင့်အတူပူးပေါင်းဆောင်ရွက်ပါ

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

 $target = realpath('/var/www/html/data/original.txt');
$link = '/var/www/html/data/link.txt';

3 ။ အသုံးပြုသူဖန်တီးမှုအတိုင်းအတာကိုကန့်သတ်ပါ

အသုံးပြုသူထိန်းချုပ်ထားသောလမ်းကြောင်းများကို Symlink () တွင်တိုက်ရိုက်ပါ 0 င်ရန်ခွင့်မပြုပါနှင့်, လမ်းကြောင်းကိုကန့်သတ်ရန် Whitelist စိစစ်အတည်ပြုကိုသုံးနိုင်သည်။

 $allowedDir = '/var/www/html/data/';
$target = realpath($_POST['path']);

if (strpos($target, $allowedDir) === 0) {
    symlink($target, $link);
} else {
    die('တရားမဝင်လမ်းကြောင်း');
}

4 ။ လုံခြုံရေးကိုအားဖြည့်ခြင်း

1 ။ သင်္ကေတ link များကိုအထိခိုက်မခံသောလမ်းညွှန်များကိုညွှန်ပြရန်တားမြစ်သည်

Link Target ကိုစစ်ဆေးရန် Readlink () သို့မဟုတ် realapher () realapher () ကိုသုံးပါ

 $realTarget = realpath($target);
if (strpos($realTarget, '/var/www/html/data/') !== 0) {
    die('တရားမဝင် link ကိုပစ်မှတ်');
}

2 ။ စစ်ဆင်ရေးအပြုအမူသစ်ထုတ်လုပ်ရေး

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

 file_put_contents('/var/log/link_log.txt', date('c') . " link တစ်ခုဖန်တီးပါ: $link -> $target\n", FILE_APPEND);

3 ။ ယာယီဖိုင်နှင့်သော့ခတ်ယန္တရားများကိုသုံးပါ

မြင့်မားသောတစ်ပြိုင်နက်တည်းသို့မဟုတ်လူမျိုးရေးအခြေအနေများကြောင့်ဖြစ်ပေါ်လာသောခွင့်ပြုချက် ပြ problems နာများကိုရှောင်ရှားရန်,

 $fp = fopen('/tmp/link.lock', 'w+');
if (flock($fp, LOCK_EX)) {
    symlink($target, $link);
    flock($fp, LOCK_UN);
}
fclose($fp);

5 ။ အခြားရွေးချယ်စရာဖြေရှင်းချက်အကြံပြုချက်များ (shared hosting သို့မဟုတ်ကန့်သတ်သောပတ်ဝန်းကျင်များအတွက်)

အကယ်. ပတ်ဝန်းကျင်က (ထိုကဲ့သို့သောမျှဝေထားသော hosting) ကဲ့သို့သော (ထိုကဲ့သို့သော shared hosting) ကို (ထိုကဲ့သို့သော shared hosting) ကိုအားလုံးခွင့်မပြုပါက PHP ကိုသုံးနိုင်သည်။

 header('Location: https://gitbox.net/files/original.txt');
exit;

ဤနည်းလမ်းသည် system-level link မဟုတ်သော်လည်း၎င်းသည်လိုအပ်ချက်များအတွက်လိုအပ်ချက်များနှင့်ခွင့်ပြုချက်အတွက်တင်းကျပ်လိုအပ်ချက်များမရှိပါ။