停止用户创建子文件夹4深

时间:2018-04-01 07:30:01

标签: php codeigniter

我想知道是否有可能阻止人们创建子文件夹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));
}

1 个答案:

答案 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));