2013-02-22 78 views
2

我目前正在編寫一個HTTP服務器在C中的UNIX套接字,我即將實現GET請求的一部分,檢查請求的文件確保它有適當的權限。編寫我自己的HTTP服務器 - 如何找到文件的相對路徑

在我知道關於HTTP服務器的任何信息之前,我建立了一個Apache服務器,並且據我瞭解,HTTP服務器只有一個目錄可以查找請求的文件。我不知道這是否是因爲服務器在目錄之外沒有任何權限,或者它實際驗證路徑以確保它位於目錄中。

現在,我即將實現這個我自己,我不知道如何正確處理這個。在C中有一個函數可以讓我確定一個路徑是否在給定的目錄中(例如內的foo/)?

在Python中,我將使用os.path.relpath並檢查結果是否以..開頭,以確保路徑不在給定目錄之外。

例如,如果目錄爲/foo/bar/htdocs,並且給定的路徑是index.html/../../passwords.txt,我想../passwords.txt,這樣我就可以從領先..該文件是/foo/bar/htdocs目錄外看到。

+0

沒有C++?純粹的ansi c? – 2013-02-22 09:33:54

+0

@RicardoOrtegaMagaña只是簡單的ANSI C,我的教師推薦這個或Java來完成一個任務。 – Darthfett 2013-02-22 09:38:11

回答

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; 
} 
1

您會驚訝地發現多少Python的I/O功能或多或少直接映射到POSIX可以執行的功能。 :)

換句話說,查找realpath()

當POSIX有更具描述性名稱的函數,包括額外的字母! :)

+0

我認爲你錯誤地解釋了我的問題,我想從一個特定的目錄(例如'htdocs')得到一個* relative *路徑,這樣我就可以確定文件路徑是否好。 – Darthfett 2013-02-22 17:36:28

0

How to get the absolute path for a given relative path programmatically in Linux?

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

你可以試試。正如同樣的ser(unwind)在那裏回答。

+0

我需要一個從目錄到給定相對路徑的相對路徑,我想原始問題並不清楚,我會編輯。 – Darthfett 2013-02-22 17:42:41

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()來確保該文件是常規文件,並且該服務器有權讀取該文件。

+0

你最後一段是我試圖解決的確切問題,哈哈。 – Darthfett 2013-02-24 18:44:43

+0

然後,您可以按照我的上述指導方針進行操作,也可以在開源Web服務器中查找它是如何完成的。編寫這樣的代碼並不是一項簡單的任務(特別是如果*和*有效地正確完成),所以它不能在這裏公佈(太具體,太長,太複雜)。 – Gil 2013-02-25 07:34:02

相關問題