すべての解説
深刻度:中ファイル・パス・リソースの取り扱い

公開されたディレクトリインデックス:ファイルサーバーがすべてを一覧表示するとき

ディレクトリインデックスが有効だと、/uploads/のようなパスにアクセスしたとき、403や404ではなく、そのディレクトリ内のすべてのファイルを閲覧できる一覧が返されます。バックアップアーカイブ、ログファイル、ユーザーがアップロードしたコンテンツは、Webで配信されるディレクトリ内に誰でも読める状態で放置されがちなため、攻撃者はまずここを調べます。

これは何か

ディレクトリリスティング(ディレクトリインデックスとも呼ばれます)は、ディレクトリがリクエストされ、インデックスファイルが存在しない場合にHTMLのファイルブラウザを生成するWebサーバーの機能です。一部のnginx設定(autoindex on)やApache(Options +Indexes)ではデフォルトで有効になっており、静的ホスティングには便利ですが、ファイルを公開すべきでない場所では弱点になります。

AppSafeは、設定ミスが多いパス(/uploads/、/files/、/backup/、/backups/、/logs/、/tmp/)をチェックし、ディレクトリリスティングと判別できるレスポンスを返すものを報告します。公開されたディレクトリが1つあるだけでも、発見されることを想定していなかったデータが露出する可能性があります。

なぜ重要か

公開されたディレクトリには、ユーザーがアップロードしたファイル、圧縮されたデータベースダンプ、認証情報やセッショントークンを含むアプリケーションログ、デプロイ時に残されたソースアーカイブなどがよく含まれています。見つけるのに認証も攻撃手法も必要なく、URLを入力するだけです。

自動スキャナーは、AppSafeがチェックするのと同じよく知られたパスを、到達可能なすべてのホストに対して絶えず調べています。.sql.gzダンプを含む公開された/backup/ディレクトリは、実質的にパスワードなしで手渡されたデータベースの完全なエクスポートです。

直し方

nginxでautoindexを無効にする

ユーザーが管理するディレクトリを配信するserverブロックやlocationブロックで、autoindexディレクティブを削除するか明示的にoffにします。

location /uploads/ {
  autoindex off;
  # Serve individual files but never list directory contents
}
機密性の高いディレクトリをWebルートの外に移す

最も安全な対策は、アップロード、バックアップ、ログをWebサーバーがまったく配信しないディレクトリに保存することです。アプリケーションは認証付きのルートを通じてファイルを読み込んでストリーミングするため、ファイルシステム上の生のパスには決して到達できません。

Next.jsではルートハンドラーでファイルアクセスを制御する

ユーザーのアップロードやバックアップをpublic/ディレクトリに置かないでください。認証を強制し、リクエストされたパスをサニタイズできるAPIルート経由で配信します。

// app/api/uploads/[filename]/route.ts
import { getSession } from "@/lib/auth-session";
import { readFile } from "fs/promises";
import path from "path";

export async function GET(
  _req: Request,
  { params }: { params: { filename: string } }
) {
  const session = await getSession();
  if (!session) return new Response(null, { status: 401 });

  // path.basename prevents directory traversal
  const safe = path.basename(params.filename);
  const filePath = path.join(process.cwd(), "private-uploads", safe);
  const data = await readFile(filePath);
  return new Response(data);
}
内部向けの一覧エンドポイントは認証で保護する

閲覧可能なファイルインターフェース(メディアライブラリ、内部ログビューアーなど)が本当に必要な場合は、URLを知られないことに頼るのではなく、認証でパスを保護してください。

location /logs/ {
  autoindex on;
  auth_basic "Internal only";
  auth_basic_user_file /etc/nginx/.htpasswd;
}

FAQ

ディレクトリリスティングは常に問題ですか?それとも特定のパスだけですか?

ファイルに機密性のあるものが含まれていれば、どこでも問題です。インデックスが有効な静的画像を配信する公開CDNは通常無害ですが、/logs/、/backup/、/uploads/はほとんどの場合そうではありません。公開を前提に精査されていないファイルが溜まっていくからです。

ディレクトリに空のindex.htmlを置けば一覧表示を防げますか?

それでそのディレクトリの一覧は隠れますが、サブディレクトリはすべて開いたままです。また、新しいディレクトリを作成したときに見落としやすくなります。サーバーレベルでautoindexを無効にすれば、その配下すべてをカバーする確実な設定レベルの対策になります。

AppSafeは公開されたディレクトリインデックスをどの深刻度で報告しますか?

中です。一覧表示そのものは侵害ではなく、侵害への道筋です。データベースダンプを含む閲覧可能な/backup/ディレクトリや、認証トークンが平文で書かれた/logs/ディレクトリがあれば、それだけですぐに中を超える深刻度になります。

あなたのアプリは大丈夫ですか?

AppSafeなら、この問題を含む数十項目を1回の無料スキャンでチェックできます。

アプリを無料でスキャン