【问题标题】:Determine relative position between two directories确定两个目录之间的相对位置
【发布时间】:2014-11-25 16:50:21
【问题描述】:

这是一个网络服务器分配,这是我想实现的额外功能。我想确保客户端不能在服务器根目录上方指定文件。

例如,假设我有一个“上方”文件夹,而在“上方”中,我有www。我在服务器中将根目录设置为/above/www,因此服务器应该能够访问/above/www 中的任何内容。还可以说我在above 中有一些a1.txt,所以/above/a1.txt,我不希望客户端能够执行GET /../a1.txt HTTP/1.0 并访问该文件。

我已经实现了 90% 的服务器,我只需要确定文件是在文件系统树中的给定目录之上还是在之下。除了计算../ 字符串之外,我想不出一种超级简单的方法,如果这些字符串的数量比文件夹的数量多,那么我就在我的根目录之上。

我运行的是linux,可以接受c++11。

【问题讨论】:

  • 所以,总而言之,您想要比计数更超级简单的东西吗?
  • 我只是想知道在我去实现它之前是否有一个函数可以满足我的需求。
  • 我认为例如 Apache 已经这样做了?

标签: c++ linux c++11 directory


【解决方案1】:

使用boost::filesystem::path(relativePath).absolute().parent_path().string()获取relativePath所代表的文件所在目录的绝对路径。现在,您可以简单地检查"/above/www"是该目录的前缀。

【讨论】:

    【解决方案2】:

    我完成任务的方法是使用两个for循环和strtok。 这可能不是最 C++ 的答案,但它有效。

    bool within_dir(const char* path, const char* root_dir)
    {
    
        assert(path != NULL);
        assert(root_dir != NULL);
        char *fname_dup, *root_dup, *token;
        int root_value, path_value;
    
        // Duplicate char arrays so strtok doesn't damage the originals
        fname_dup = (char*)malloc(sizeof(char) * strlen(path) + 1);
        assert(fname_dup != NULL);
        bzero(fname_dup, sizeof(char) * strlen(path) +1 );
        strncpy (fname_dup, path, sizeof(char) * strlen(path));
    
        root_dup = (char*)malloc(sizeof(char) * strlen(root_dir) + 1);
        assert(root_dup != NULL);
        bzero(root_dup, sizeof(char) * strlen(root_dir)+ 1);
        strncpy(root_dup, root_dir, sizeof(char) * strlen(root_dir) );
    
        // Count root directory
        for (root_value = 0, token = strtok(root_dup, "/");
                        token != NULL;
                        token = strtok(NULL, "/"))
        {                                        
                if (strcmp(token, "..") == 0)
                        root_value--;
                else
                        root_value++;
        }
    
        // Count and compare path value to root value
        for (path_value = 0, token = strtok(fname_dup, "/");
                        token != NULL;
                        token = strtok(NULL, "/"))
        {
                if (strcmp(token, "..") == 0)
                {
                        path_value--;
                        if (path_value < root_value)
                        {
                                free(root_dup);
                                free(fname_dup);
                                return false;
                        }
                }
                else
                        path_value++;
        }
        free(root_dup);
        free(fname_dup);
        return true;
    
    }
    

    基本上,代码会遍历并计算根的“正面”或“负面”程度。上升一个水平是消极的,下降一个水平是积极的。一旦它知道根的值,如果文件路径的值低于根的值,我们就知道文件路径必须至少比根目录高一层,因此是无效的。由于我们实际上并不关心实际值,只有当它从根目录上一层时,我们才立即停止并返回 false。如果文件路径始终比根目录更正,则文件路径将始终位于文件树的较低位置。不保证链接。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 2021-06-18
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      相关资源
      最近更新 更多