MKDIR 3级以上使用php

时间:2013-08-26 05:51:56

标签: php

level1/level2/level3/CWD/mkdir.php

Level1的名称未知;是用户指定的&可以是任何东西。 level2&的名称level3已知并将保持静态。 当前工作目录包含mkdir.php文件,该文件是使用用户提供的名称在level1中创建目录所必需的。 下面的mkdir.php文件完成了这项工作,但不知道这是否正确。希望专家批准和建议。提前谢谢。

<?php
    if (isset($_POST['Name']))
    {   
    $newdir = $_POST['Name'];
    $dirname = "..\\$newdir";   

    $step1 = "..\\CWD";     
    $step2 = "..\\$step1";      
    $step3 = "..\\$step2\\$dirname";    

    if (mkdir($step3, 0777, true))
        {
        echo "dir created successfully";
        }
        else
        {
        echo  "dir not created";
        }
    }
?>

2 个答案:

答案 0 :(得分:4)

如果您正在运行mkdir.php,则可以连续使用dirname(),直至到达level1

此外,清理输入数据以防止恶意用户在您的系统上创建“恶意”目录非常重要。

$name = filter_input(INPUT_POST, 'Name', FILTER_VALIDATE_REGEXP, array('options' => array(
    'regexp' => '/^\w+$/',
    'flags' => FILTER_NULL_ON_FAILURE,
)));

if (!is_null($name)) {
    $base = dirname(dirname(dirname(__DIR__)));
    //      level1  level2  level3  CWD
    $path = sprintf('%s/%s', $base, $name);

    mkdir($path, 0777, true);
}

答案 1 :(得分:0)

  1. 为什么要使用\而不是/
  2. 你使用了太多变量,你可以写一个路径到dir用一行创建新目录的地方
  3. $ _ POST ['Name']应该被清理,因为它可以包含../,所以它会使目录在错误的目录中
  4. 更短更清洁的解决方案:

    if(isset($_POST['Name'])) {
    
        $new_dir_name = $_POST['Name'];
    
        // it should work on linux and windows
        $new_dir_path = '../../../../'; # '/' should be at the end!!!
    
        //use this if one above doesn't work on windows
        //$new_dir_path = '..\\..\\..\\..\\'; 
    
        if(mkdir($new_dir_path.$new_dir_name, 0777, true)) {
            echo "dir created successfully";
        }
        else {
            echo  "dir not created";
        }
    }