我想知道是否有可能阻止人们创建子文件夹4深度
询问如何制作它以便当用户想要创建一个子文件夹4深,它不会让该用户。我只想要它,所以可以创建3个深子文件夹。
$this->input->get('directory')
目录/主页/视图
public function folder()
{
$json = array();
if ($this->input->get('directory') != '') {
$directory = FCPATH . 'images/'. $this->input->get('directory') . '/';
@mkdir($directory . $this->input->post('folder'), 0777, true);
$json['success'] = true;
} else {
$directory = FCPATH . 'images/catalog/';
@mkdir($directory . $this->input->post('folder'), 0777, true);
$json['success'] = true;
}
$this->output->set_content_type('Content-Type: application/json');
$this->output->set_output(json_encode($json));
}
答案 0 :(得分:2)
首先想到的是
为什么甚至允许用户创建文件夹? 如果有人发现 你在这做什么,并了解程序 - 它是非常可能的 你可以被淹没(突然你有成千上万的文件夹 这里...)
但如果你不关心这个问题,那么你面临的是一个非常困难的问题,这个问题根本不重要,因为你做了很多检查
我可以给你一个开始 - 但要注意这不是全部......如果你真的将它设置为生产状态,唯一的调试方式就是结果;)
检查您获得的目录是否有效。
对于这个问题,我从here获取了该功能,删除了/
并添加了.
(在这种情况下,它会阻止任何人走出您的根目录)
下面的代码是一个片段,但应该清楚我想要什么,并且可以很容易地扩展...
try
{
$strBaseDirectory = FCPATH . 'images/';
$strUserDirectory = $this->input->get('directory');
if (empty($strUserDirectory) || strpbrk($strUserDirectory, "\\.?%*:|\"<>")) throw new InvalidArgumentException('Invalid directory');
$strUserDirectory = trim($strUserDirectory, '/');
$arrPathParts = explode('/', $strUserDirectory);
if (count($arrPathParts) > 3) throw new InvalidArgumentException('To much folders...');
$arrPathParts = array_map(function($item) {
return trim($item);
}, $arrPathParts);
$key = array_search('', $arrPathParts);
if ($key) throw new InvalidArgumentException('One or more Foldername(s) contain only spaces...');
echo '<pre>';
print_r($arrPathParts);
$strUserDirectory = implode('/', $arrPathParts);
$blnDirectoryCreated = mkdir($strBaseDirectory.$strUserDirectory);
$arrJson = [
'success' => $blnDirectoryCreated,
'message' => 'whatever...'
];
}
catch (Exception $e)
{
$arrJson = [
'success' => false,
'message' => $e->getMessage()
];
}
$this->output->set_content_type('Content-Type: application/json');
$this->output->set_output(json_encode($arrJson));