2

私は現在、C で UNIX ソケットを介して HTTP サーバーを作成しており、要求されたファイルをチェックして適切なアクセス許可があることを確認する GET 要求の一部を実装しようとしています。

HTTP サーバーについて何も知る前に、Apache サーバーをセットアップしました。HTTP サーバーが要求されたファイルを見つけるために参照する単一のディレクトリがあることを理解しています。これは、サーバーが何らかの形でディレクトリ外へのアクセス許可を持っていないためなのか、実際にパスを検証してディレクトリ内にあることを確認するためなのかはわかりません。

これを自分で実装しようとしているので、これを適切に処理する方法がわかりません。パスが特定のディレクトリ内にあるかどうかを判断できる C の関数はありますか (たとえば、foo/bar/../../baz内にあり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; 
}

あなたはそれを試すことができます。同じser(巻き戻し)がそこに答えたように。

于 2013-02-22T09:45:46.820 に答える
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 に答える