我的root dir 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);
?>
如何解决这个问题。
答案 0 :(得分:1)
&#34; root&#34;的目的目录是保护托管计算机免受可能损坏存储在计算机其他部分中的信息的恶意/错误代码。它为您提供了一个区域,您可以在其中明确地安全地做您的事情,并故意阻止您干扰任何数据&#34;以上&#34;你的根目录。根据设计,根部尽可能低。任何具有允许您访问指定空间之外的数据的漏洞的主机都是主机要求被黑客攻击;你希望找不到其中的许多人。
重新构建根目录中的目录以模拟比实际限制的目录更深的根可能是值得的。否则,需要说服系统管理员让主机允许您进行其他访问。
在设计合理且管理完善的系统中,您所要求的内容是故意无法实现的,并且遇到此特定障碍更多的迹象表明您可能需要根据您的限制重新考虑您要执行的操作。即使这是从您自己的计算机托管并且您是系统管理员,最好还是检查一切可能实现您希望实现的目标的方法,而不会破坏这一障碍。任何意味着你实现允许网络控制的代码打破这个障碍是你的系统中某个人正在寻找机会利用的漏洞。
答案 1 :(得分:1)
这是一个安全问题,因为它提供对世界的读写访问权限。可能是您的 apache 用户对目录没有读/写权限。
以下是$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可以使用流包装器,因此可以编写mkdir('ftp://user:pass@server/mydir');
或
如果 SAFE MODE 限制有问题,即如果您尝试创建和访问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;
}
?>
也许有帮助。