嗨,我要在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";
}
最简单的解决方案是什么?不要让用户实际上浏览您的文件系统。如果它是一个文档上传应用程序或类似的,在数据库中表示它。
因此,您将拥有数据库中表示的目录(类别),以及每个类别的文件(项)。