我在网上找到了一些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/
。
我想要做的是设置默认(或" 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");
}
我感谢任何人都可以提供给我的任何帮助,并且愿意提前感谢任何人花时间看我的问题。
答案 0 :(得分:0)
您是否尝试过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");
}
虽然这可能会解决您的问题,但我认为整个脚本编写得很糟糕。