如何更改某些代码的主目录


How can I change the home directory of some code?

我在网上找到了一些PHP(它是一个没有权限的1页文件管理器),我觉得它非常棒,适合我当前的需求。但是,我在更改工作(默认)目录时遇到了一些问题。

我从一个不再维护的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/的东西。

我想做的是设置默认(或"主")目录,这样文件管理器就不能访问根目录,只能访问指定的子文件夹。

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");
}

我感谢任何人能为我提供的帮助,并提前感谢任何人花时间研究我的问题。

您尝试过chdir()函数吗?

以后编辑
根据您编辑的问题更新我的答案。

主要问题是30号线

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

这需要是文件的完整真实路径,并且必须与用户的"主页"进行比较
第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");
}

虽然这可能会解决你的问题,但我认为整个剧本写得很糟糕。