Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中限制对目录及其子目录的访问?_Php_File Permissions - Fatal编程技术网

如何在PHP中限制对目录及其子目录的访问?

如何在PHP中限制对目录及其子目录的访问?,php,file-permissions,Php,File Permissions,您好,我正在PHP上制作某种文件浏览器,例如,如果我有如下根文件夹: / (root) | | |---home | | |---user | | |---folder | |---folder1 | |---file1 现在我该怎么做呢user只能浏览/home/user/内部的文件,而不能浏览例如cd.

您好,我正在PHP上制作某种文件浏览器,例如,如果我有如下根文件夹:

/ (root)
|
|
|---home
      |
      |
      |---user
           |
           |
           |---folder
           |
           |---folder1
           |
           |---file1
现在我该怎么做呢
user
只能浏览/home/user/内部的文件,而不能浏览例如
cd.././
和外出?非常感谢:) 这是我用于
cd
命令的代码:

<?php
function cd($actualdir, $dir) {
    //echo $actualdir.$dir."<br>";
    if($dir == "..") {
        $expdir = explode("/", $actualdir);
        $newdir = array_pop($expdir);
        $fulldir = "";
        foreach($expdir as $value) {
            $fulldir .= $value."/";
        }
        $fulldir = substr($fulldir, 0, -1);
        if($fulldir == "./rootfs/home") {
            return "permission denied";
        } else {
            return $fulldir;

        }

    } else {
        if(file_exists($actualdir."/".$dir)) {
            //echo $dir;
            return $actualdir."/".$dir;
        } else {
            return "no";
        }
    }

}

?>

顺便说一句,root dir只是web服务器根目录上的一个目录,应该充当shell的系统根目录

编辑:基本上,如果用户是
用户
只允许他进入
/home/user
及其子目录。如果用户是
test
,则只能访问
/home/test
和子目录。这就是您可以使用($fulldir)让文件系统解析相对路径(如..和符号链接)的全部内容

您可以使用($fulldir)让文件系统解析相对路径(如..和符号链接)


最简单的解决方案?不要让用户实际浏览您的文件系统。如果是文档上传应用程序或类似应用程序,则在数据库中表示它


因此,您可以在数据库中显示目录(类别),并为每个类别显示文件(项目)。

最简单的解决方案是什么?不要让用户实际浏览您的文件系统。如果是文档上传应用程序或类似应用程序,则在数据库中表示它


因此,您可以在数据库中显示目录(类别),以及每个类别的文件(项目)。

最后完成此操作:

if(strpos($dir, "../../") !== false) {
        return $dir." not allowed";
    }
    if($dir == "..") {
        $expdir = explode("/", $actualdir);
        $newdir = array_pop($expdir);
        $fulldir = "";
        foreach($expdir as $value) {
            $fulldir .= $value."/";
        }
        $userlength = strlen($user);
        $finalength = strlen($user)+14;
        $userdir = substr($actualdir."/".$dir, 0, $finalength);

        $fulldir = substr($fulldir, 0, -1);
        if (strpos($fulldir, $userdir) !== false) {
            return $fulldir;

        } else {
            return "permission denied";
        }

最后结束了这项工作:

if(strpos($dir, "../../") !== false) {
        return $dir." not allowed";
    }
    if($dir == "..") {
        $expdir = explode("/", $actualdir);
        $newdir = array_pop($expdir);
        $fulldir = "";
        foreach($expdir as $value) {
            $fulldir .= $value."/";
        }
        $userlength = strlen($user);
        $finalength = strlen($user)+14;
        $userdir = substr($actualdir."/".$dir, 0, $finalength);

        $fulldir = substr($fulldir, 0, -1);
        if (strpos($fulldir, $userdir) !== false) {
            return $fulldir;

        } else {
            return "permission denied";
        }

这可以起一半作用,因为它停止
cd..
但不停止
cd.././.
或类似的功能:(也可以在允许的目录上停止
cd..
您可以在现有的文件夹结构上尝试它吗?我添加了一个检查来确保这一点。这可以起一半作用,因为它停止
cd..
但不停止
cd.././.
或类似的功能:(这也会杀死允许的目录上的
cd.
。?您是否可以在现有的文件夹结构上尝试它?我添加了一个检查来确保。哦,如果我输入
。/../../../code>?或者
(win)?或者
?或者
。)会发生什么情况?