1
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";
        }
    }
?>
4

2 回答 2

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);
}
于 2013-08-26T06:25:28.113 回答
0
  1. 为什么使用 \ 而不是 /
  2. 你使用了太多变量,你可以用一行写到目录的路径来创建新目录
  3. $_POST['Name'] 应该被清理,因为它可以包含 ../ 所以它会在错误的目录中创建目录

更短更清洁的解决方案:

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";
    }
}
于 2013-08-26T06:06:00.997 回答