如何使用 php 在根目录之上创建文件夹

How to create a folder above the root directory using php

我的根目录 ID

/var/www/html/

我想在 /var/www/ 创建目录 即/var/www/myfolder

我正在执行 create_dir.php 来自

/var/www/html/site/create_dir.php

当我执行这个程序时,它无法创建文件夹。

在日志中,我正在获得拒绝权限。 更新

这是我的代码

<?php
$os_type=php_uname('s');
$cur_file_path=$_SERVER['PHP_SELF'];
echo "File path:$cur_file_path<br>";
$scount=substr_count($cur_file_path, '/');
echo "/ count:$scount<br>"; 
$doc_root= $_SERVER['DOCUMENT_ROOT'] ;
echo "doc root:$doc_root<br>";
if($os_type=='Linux')
{
$ds=substr_count("$cur_file_path","/");//directory seperator
echo "Count of /=$ds<br>";
}
if($os_type=='Windows')
{
$ds=substr_count("$cur_file_path","'\'");//directory seperator
}
$path="../";
for($i=1;$i<$scount;$i++)
{

    $path.="../";
}

$dir="myfolder";
exec("mkdir ".$dir);
?>

如何解决这个问题。

"root" 目录的目的是保护主机免受 malicious/buggy 代码的影响,这些代码可能会损坏存储在计算机其他部分的信息。它为您提供了一个区域,您可以在其中安全地做您的事情,同时明确和有意地防止您干扰任何数据 "above" 您的根目录。按照设计,根尽可能低。任何具有允许您访问分配的 space 之外的数据的漏洞的主机都是乞求被黑客攻击的主机;希望你不会找到很多这样的东西。

重组根目录中的目录以模拟比您实际限制的更深的根目录可能是值得的。否则,需要说服主机的系统管理员允许您进行额外访问。

在一个设计和管理得当的系统中,你所要求的是故意不可能的,运行进入这个特定的障碍更像是一个迹象,表明你可能需要重新考虑你想做什么你的限制。即使这是在您自己的计算机上托管并且您是系统管理员,明智的做法是检查您可以在不打破障碍的情况下实现您希望实现的目标的所有可能方法。 ANY 意味着您实施允许 web-controlled 代码来打破该障碍是您系统中的一个漏洞,某个地方的某人正在寻找利用的机会。

这是一个安全问题,因为它提供了对世界的读写访问权限。可能是您的 apache 用户对该目录没有 read/write 权限。

如果 $os_type=='Linux'

,您可以这样做

1. 确保所有文件都属于 Apache 组和用户。在 Linux 中是 www-data 组和用户

exec('chown -R www-data:www-data /path/to/webserver/www',$ouput,$result); 

2. 接下来启用www-data组的所有成员读写文件

exec('chmod -R g+rw /path/to/webserver/www',$ouput,$result);

php mkdir() 函数现在应该可以正常工作而不会返回错误。出错时也可以在$output中查看错误输出。

还有另一种创建目录的方法ftp:

你可以用ftp试试mkdir,mkdir是和stream wrapper一起工作的,所以写mkdir('ftp://user:pass@server/mydir');

没问题

如果您遇到 安全模式 限制的问题,即如果您尝试创建和访问 subdirectorys 递归,您可以使用 ftp-lib像这样。

<?php

DEFINE ('FTP_USER','yourUser');
DEFINE ('FTP_PASS','yourPassword');

/**
* Returns the created directory or false.
*
* @param Directory to create (String)
* @return Created directory or false;
*/

function mkDirFix ($path) {


        $path = explode("/",$path);
        $conn_id = @ftp_connect("localhost");
        if(!$conn_id) {
            return false;
        }
        if (@ftp_login($conn_id, FTP_USER, FTP_PASS)) {

            foreach ($path as $dir) {
                if(!$dir) {
                    continue;
                }
                $currPath.="/".trim($dir);
                if(!@ftp_chdir($conn_id,$currPath)) {
                    if(!@ftp_mkdir($conn_id,$currPath)) {
                        @ftp_close($conn_id);
                        return false;
                    }
                    @ftp_chmod($conn_id,0777,$currPath);
                }
            }
        }
        @ftp_close($conn_id);
        return $currPath;

}
?>

也许有帮助。