2

我目前正在用 C 语言编写一个基于 UNIX 套接字的 HTTP 服务器,并且我即将实现 GET 请求的一部分,该部分检查请求的文件以确保它具有适当的权限。

在我对 HTTP 服务器一无所知之前,我设置了一个 Apache 服务器,据我了解,HTTP 服务器通过一个目录来查找请求的文件。我不知道这是否是因为服务器以某种方式在目录之外没有权限,或者它是否实际上验证了路径以确保它在目录内。

现在我要自己实现这个,我不知道如何正确处理这个。C 中是否有一个函数可以让我确定路径是否在给定目录内(例如在foo/bar/../../bazinside foo/)?

在 python 中,我会使用os.path.relpath并检查结果是否以 开头..,以确保路径不在给定目录之外。

例如,如果目录是/foo/bar/htdocs,并且给定的路径是index.html/../../passwords.txt,我想要../passwords.txt,所以我可以从开头看到..文件在/foo/bar/htdocs目录之外。

4

4 回答 4

1

您会惊讶于 Python 的 I/O 功能有多少直接映射到 POSIX 可以做的事情。:)

换句话说,向上看realpath()

当 POSIX 具有更具描述性的函数名称时,这真是太棒了,包括那个额外的字母!:)

于 2013-02-22T09:30:41.487 回答
0

如何在 Linux 中以编程方式获取给定相对路径的绝对路径?

#include <stdlib.h> 
#include <stdio.h> 
int main() 
{ 
        char resolved_path[100]; 
        realpath("../../", resolved_path); 
        printf("\n%s\n",resolved_path); 
        return 0; 
}

你可以试试。正如同一个服务员(放松)在那里回答的那样。

于 2013-02-22T09:45:46.820 回答
0

它的工作方式要简单得多:一旦服务器收到请求,它只查看其 htdoc(静态内容)目录以检查请求的资源是否存在:

char *htdoc = "/opt/server/htdoc"; // here a sub-directory of the server program
char *request = "GET /index.html"; // the client request
char *req_path = strchr(request, ' ') + 1; // the URI path

char filepath[512]; // build the file-system path
snprintf(filepath, sizeof(filepath) - 1, "%s/%s", htdos, req_path);

FILE *f = fopen(filepath, "r"); // try to open the file
...

请注意,此代码是不安全的,因为它不检查请求是否通过包含“../”模式(和其他技巧)进入文件系统。您还应该使用stat()以确保该文件是常规文件并且服务器有权读取它。

于 2013-02-22T18:04:33.527 回答
0

作为一个简单(但不完整)的解决方案,我只是决定编写一些代码来检查任何...

int is_valid_fname(char *fname) {
    char *it = fname;
    while(TRUE) {
        if (strncmp(it, "..", 2) == 0) {
            return FALSE;
        }
        it = strchr(it, '/');
        if (it == NULL) break;
        it++;
    }
    return TRUE;
}
于 2013-02-24T18:46:58.033 回答