Semua panduan
Tingkat SedangPenanganan File, Path & Resource

Indeks direktori terbuka: saat file server Anda menampilkan semuanya

Ketika directory indexing aktif, mengunjungi path seperti /uploads/ mengembalikan daftar yang bisa dijelajahi berisi setiap file di direktori tersebut, bukan 403 atau 404. Penyerang melihat ke sini terlebih dahulu karena arsip backup, file log, dan konten unggahan pengguna sering dibiarkan dapat dibaca siapa saja di dalam direktori yang disajikan web.

Apa itu

Directory listing (disebut juga directory indexing) adalah fitur web server yang menghasilkan file browser HTML ketika sebuah direktori diminta dan tidak ada file indeks. Aktif secara default di beberapa konfigurasi nginx (autoindex on) dan Apache (Options +Indexes), fitur ini memudahkan host statis tetapi menjadi masalah di mana pun file seharusnya tidak publik.

AppSafe memeriksa sekumpulan path yang sering salah konfigurasi — /uploads/, /files/, /backup/, /backups/, /logs/, dan /tmp/ — dan menandai path mana pun yang mengembalikan respons directory listing yang dikenali. Bahkan satu direktori terbuka bisa mengekspos data yang tidak pernah dimaksudkan untuk ditemukan.

Kenapa penting

Direktori yang terekspos rutin berisi file unggahan pengguna, dump database terkompresi, log aplikasi berisi kredensial atau token sesi, dan arsip source sisa deploy. Menemukannya tidak butuh autentikasi maupun eksploitasi — cukup mengetik URL-nya.

Scanner otomatis terus-menerus memeriksa path-path terkenal yang sama dengan yang diperiksa AppSafe, ke setiap host yang dapat dijangkau. Direktori /backup/ terbuka yang berisi dump .sql.gz pada dasarnya adalah ekspor database lengkap yang diserahkan tanpa password.

Cara memperbaiki

Nonaktifkan autoindex di nginx

Hapus atau matikan secara eksplisit direktif autoindex di setiap blok server atau location yang menyajikan direktori yang dikendalikan pengguna.

location /uploads/ {
  autoindex off;
  # Serve individual files but never list directory contents
}
Pindahkan direktori sensitif ke luar web root

Perbaikan paling aman adalah menyimpan unggahan, backup, dan log di direktori yang sama sekali tidak disajikan web server. Aplikasi Anda membaca dan mengalirkan file melalui route yang terautentikasi — path filesystem mentahnya tidak pernah dapat dijangkau.

Di Next.js, lindungi akses file dengan route handler

Jangan pernah menaruh unggahan pengguna atau backup di dalam direktori public/. Sajikan melalui API route yang dapat menerapkan autentikasi dan membersihkan path yang diminta.

// 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);
}
Lindungi endpoint listing internal dengan autentikasi

Jika Anda benar-benar butuh antarmuka file yang bisa dijelajahi (media library, penampil log internal), lindungi path tersebut dengan autentikasi alih-alih mengandalkan ketidakjelasan.

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

FAQ

Apakah directory listing selalu menjadi masalah, atau hanya pada path tertentu?

Ini masalah di mana pun file berisi sesuatu yang sensitif. CDN publik yang menyajikan gambar statis dengan indexing aktif biasanya tidak berbahaya; /logs/, /backup/, dan /uploads/ hampir tidak pernah aman, karena menumpuk file yang tidak diperiksa untuk akses publik.

Bisakah saya cukup menaruh index.html kosong di direktori untuk memblokir listing?

Itu menyembunyikan listing untuk satu direktori tersebut, tetapi setiap subdirektori tetap terbuka. Cara ini juga mudah terlewat saat direktori baru dibuat. Mematikan autoindex di level server adalah perbaikan yang andal di level konfigurasi dan mencakup semua yang ada di bawahnya.

Tingkat keparahan apa yang dilaporkan AppSafe untuk indeks direktori terbuka?

Sedang. Listing itu sendiri bukan kompromi — melainkan jalan menuju kompromi. Direktori /backup/ yang bisa dijelajahi dan berisi dump database, atau direktori /logs/ dengan token autentikasi dalam teks biasa, dengan cepat melampaui tingkat sedang.

Apakah aplikasimu terpengaruh?

AppSafe memeriksa ini dan puluhan masalah lain dalam satu pemindaian gratis.

Pindai aplikasiku gratis