私の 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;