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


How can limit the access to a directory and its subdirectories in PHP?

嗨,我要在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";
        }
    }
}
?>

顺便说一句,根目录只是web服务器上的一个目录,应该作为shell的系统根目录

EDIT:基本上,如果用户是user,只允许他进入/home/user及其子目录。当用户为test时,仅限/home/test和子目录。这是所有的

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

$fulldir = $actualdir . "/" . $dir;
$rootdir = "/home/user";
$length = strlen($rootdir);
$realdir = realpath($fulldir);
if ($realdir === false)
  return "file does not exist";
if(substr($realdir, 0, $length) != $rootdir)
  return "permission denied";
return "OK: $realdir";

最后结束了:

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

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

因此,您将拥有数据库中表示的目录(类别),以及每个类别的文件(项)。