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