Как изменить домашний каталог некоторого кода?

I found some PHP online (it’s a 1 page file manager with no permissions) that I find is really awesome, it suits my current needs. Однако у меня возникли некоторые проблемы с изменением рабочего (по умолчанию) каталога.

Я получил сценарий из проекта GitHub, который больше не поддерживается. PHP сам по себе является 1 страница PHP файловый менеджер без каких-либо разрешений, баз данных и т.д. У меня уже есть система учетных записей пользователей, и я хотел бы изменить рабочий каталог на основе существующей переменной базы данных, однако я не могу найти способ обойти изменение каталога.

В настоящее время скрипт загружается в /home/advenacm/public_html/my/(как и файл /home/advenacm/public_html/my/files.php. Судя по тому, что я могу сказать, PHP использует cookie для определения рабочего каталога, но он не может найти способ обойти настройку пользовательского каталога. Я хочу использовать'/home/advenacm/public_html/my/'.$userdomain;, что в результате станет чем-то вроде /home/advenacm/public_html/my/userdomain.com/.

Я бы хотел установить каталог по умолчанию (или «home») так, чтобы файловый менеджер не мог получить доступ к корневому каталогу, только к указанной подпапке.

Что-то подобноеdirectory = "/home/advenaio/public_html/directory/"-лучший способ это объяснить. Я пробовал несколько методов, чтобы попытаться достичь этого, но ничего не работает.

Я взял на себя смелость загрузить свой код в pastebin с подсветкой синтаксиса PHP. Вот фрагмент PHP, который я считаю, выбирает рабочий каталог (строка 19-29):

$tmp = realpath($_REQUEST['file']);
if($tmp === false)
    err(404,'File or Directory Not Found');
if(substr($tmp, 0,strlen(__DIR__)) !== __DIR__)
  err(403,"Forbidden");
if(!$_COOKIE['_sfm_xsrf'])
    setcookie('_sfm_xsrf',bin2hex(openssl_random_pseudo_bytes(16)));
if($_POST) {
    if($_COOKIE['_sfm_xsrf'] !== $_POST['xsrf'] || !$_POST['xsrf'])
        err(403,"XSRF Failure");
}

Я ценю любую помощь, которую кто-либо может предложить мне, и хотел бы поблагодарить кого-либо заранее за то, что даже нашли время, чтобы посмотреть на мой вопрос.

Метки

1 ответ

  1. Вы пробовали функцию chdir ()?

    позже редактировать
    Обновление ответа на основе отредактированного вопроса.

    Основная проблема линия 30

    $file = $_REQUEST['file'] ?: '.';
    

    Это должен быть полный реальный путь к файлу и должен быть сравнен с ‘home’вашего пользователя.
    И вы должны использовать тот же путь для проверок в строке 19.
    Так вы можете заменить 19-30 С:

    $user_home = __DIR__ . "/{$userdomain}";
    
    $file = $_REQUEST['file'] ?: $user_home; //you might have to prepend $userdomain to $_REQUEST['file'], can't see from html the format.
    $file = realpath($_REQUEST['file']);
    
    if($file === false) {
        err(404,'File or Directory Not Found');
    }
    
    if(strpos($file, $user_home) !== 0) {
        err(403,"Forbidden");
    }
    
    if(!$_COOKIE['_sfm_xsrf']) {
        setcookie('_sfm_xsrf',bin2hex(openssl_random_pseudo_bytes(16)));
    }
    
    if($_POST) {
        if($_COOKIE['_sfm_xsrf'] !== $_POST['xsrf'] || !$_POST['xsrf'])
            err(403,"XSRF Failure");
    }
    

    Хотя это может решить Ваш вопрос, я думаю, что весь сценарий плохо написан.