2

特定のファイルが特定のディレクトリ内にあることを確認する必要があります (レベル数は関係ありません)。

視覚化するには:

A/ + file

また

A/ + x/x/x/..../file

レベル数に関係なく、A 未満である必要があります。

ファイル パス (プラス記号の後ろ) は、ユーザーによってプログラムに与えられます。

問題は、chroot を使用できないことです。これは、プログラムが A (B としましょう) の外にあるいくつかのフォルダーにもアクセスする必要があるためですが、ユーザー (ソケット インターフェイスを介して接続されている) は、A/ + ../B/file

これは内側の内側のループで行われるため、適切に実行する必要があります。「/」を数え、「..」の数を抽出し、「/./」の数を抽出して>= 1を比較することを考えましたが、入力がユーザー。

私が知らない、または他の方法でこれをチェックする機能はありますか?

編集:

chroot した後でもフォルダーBへのアクセスを許可する方法があれば (私の記憶が正しければ、chroot 後もファイル ハンドルが残ります。そのフォルダー バージョンが必要です)、それも問題ありません。必要なのはBにアクセスし、chroot 後にファイルを作成/読み取り/書き込みすることだけです。

EDIT2:

ちなみに、UID などを使用してこれを行う方法は知っていますが、別の方法が必要です。

4

3 に答える 3

2

ftw()ornftw() を再帰関数で呼び出すことができます。

これを行っている間、シンボリックリンクをたどったり、トラバーサルをシンボリックリンクに制限したりしないようにする必要があります。

最初の起動では、要求が受信されるまで、およびシステムがアイドル状態のときに、頻繁にアクセスするフォルダーをメモ化のためにスキャンする場合があります。すべてのリクエストはメモ化 (ハッシュテーブルなど) に追加されます。

詳細はこちらをご覧ください。

于 2013-08-03T23:42:31.947 に答える
2

これを行う最も簡単な方法は、ユーザーが指定したパス文字列を A ディレクトリのパスの末尾に追加し、POSIX realpath()関数を使用して結果のパス文字列を単純化することだと思います。(realpath() は、「..」またはシンボリックリンクの不正行為を解決し、単純な絶対ファイルパス文字列を提供します)

次に、そのパスを A ディレクトリの簡易/絶対パスと比較します。ファイル パス文字列が A のパス文字列で始まる場合 (たとえば、strncmp(file_path_str, a_dir_path_str, strlen(a_dir_path_str))==0)、ファイルへのアクセスを許可します。それ以外の場合は、アクセスを拒否します。

于 2013-08-04T00:58:30.990 に答える
0

「ユーザー」がシステムへの無料アクセス権を持っていないが、それ自体に十分な権限を持っていると仮定すると、それがchrootあなたが探しているソリューションであると思います.

したがって、入力のディレクトリ構造を検証する代わりに、単純に「ルート」を変更して「A/」を指すようにし、(必要に応じて) パスの先頭から「A/」を削除し、休み。

于 2013-08-03T23:32:50.730 に答える