0

私の PHP アプリケーションにはファイル コントローラーがあります。認証されたユーザーによるすべてのファイル ダウンロードは、最初にファイル コントローラーを通過する必要があります。

パラメータとして、ファイル inode を使用しているため、ディスク内でファイルを正しく検索し、URL を介して安全に渡すことができます (数字だけなので、UTF-8 ファイル名とここにそのような)。

ファイルはデータベースではなくファイルシステムから読み取られるため、データは可能な限りライブです。

ファイルシステムの inode を提供することはセキュリティ上の脅威ですか? inode 経由でファイルを検索するのは悪い習慣ですか?

許可チェックについて:

フレームワークとして Codeigniter を使用しています。コア コントローラー クラスと _remap() メソッドを拡張することで、ファイル コントローラーにアクセスしているユーザーがログインしているかどうかを、コントローラー呼び出しごとに確認できるようになりました。

そうである場合 (そしてロールにアクセス許可がある場合)、ダウンロードを許可します。そうでない場合は、ログインにリダイレクトします。

同じ inode で:

ファイルシステムの完全スキャンは行っていません。ファイルシステム内のディレクトリを一覧表示し、アップローダーで分割し、次に操作 ID で分割します (基本的に、パラメーターに応じて、各フォルダーには 10 個のファイル、tops が含まれます)。構造は基本的に次のとおりです。

module/module_id/user_id/files

同じフォルダーに同じinodeを持つ2つのファイルが存在することはできず、別のファイルシステムに別のファイルがある場合(または同じファイルシステムにある場合、それが可能かどうかはわかりません)、同じフォルダーにはありません。そのため、そのパラメーター チェーンではアクセスできません。

例 (inode #5243376 を持つファイルを取得したいとします):

モジュール/1/3/5243376

inode 5243376 を持つ別のファイルがある場合、ダウンロードできるように、そのファイルはフォルダー module/1/3/ 内にある必要があります。

コントローラーがそれを処理するため、同じ(または別のファイル)を取得する他の方法はありません。

ハンドラのコードは単純です:

// match inode
$dir    = FCPATH . 'files/' . $type . '/' . $id . '/'. $user . '/';
$files  = scandir($dir);

foreach($files as $file) {
    $stat = stat($dir . $file);
    if ($inode == $stat['ino']) {
        $filename = $file;
    }
}

// this need better feedback lol
if (!isset($filename)) {
    die('Not existing');
}

// fullpath to file to be downloaded
$file = FCPATH . 'files/' . $type . '/' . $id . '/'. $user . '/' . $filename;
4

1 に答える 1

3

本当に何も問題はありません。inode のみを扱っている場合でも、基本的なファイルシステムのセキュリティは引き続き適用されます。ただし、inode は OS 内で一意ではない可能性があることに注意してください。それらは特定のファイルシステム内でのみ一意です。ホスト システムの Web ルート内に複数のマウントされた FS がある場合、ファイルを別のディレクトリに移動すると、移動がファイル システムの境界を越えると、実際にはコピー + 削除操作になる可能性があります。新しい inode が新しい場所に作成されたため、inode は有効ではなくなりました。

于 2012-09-18T18:00:51.317 に答える