Indici di directory aperti: quando il tuo file server elenca tutto
Quando l'indicizzazione delle directory è attiva, visitare un percorso come /uploads/ restituisce un elenco navigabile di tutti i file della directory invece di un 403 o 404. Gli attaccanti guardano qui per primi, perché archivi di backup, file di log e contenuti caricati dagli utenti vengono spesso lasciati leggibili da chiunque in directory servite dal web.
Che cos'è
Il directory listing (detto anche directory indexing) è una funzione del web server che genera un file browser HTML quando viene richiesta una directory priva di file indice. Attivo di default in alcune configurazioni di nginx (autoindex on) e in Apache (Options +Indexes), è una comodità per gli host statici che diventa un problema ovunque i file non debbano essere pubblici.
AppSafe controlla una serie di percorsi spesso configurati male — /uploads/, /files/, /backup/, /backups/, /logs/ e /tmp/ — e segnala quelli che restituiscono una risposta riconoscibile come directory listing. Anche una sola directory aperta può esporre dati mai pensati per essere trovati.
Perché è importante
Le directory esposte contengono abitualmente file caricati dagli utenti, dump del database compressi, log applicativi con credenziali o token di sessione e archivi del sorgente rimasti dai deploy. Trovarli non richiede autenticazione né exploit — basta digitare l'URL.
Gli scanner automatici sondano di continuo gli stessi percorsi noti che controlla AppSafe, su ogni host raggiungibile. Una directory /backup/ aperta che contiene un dump .sql.gz equivale di fatto a un export completo del database consegnato senza password.
Come risolverlo
Rimuovi o disattiva esplicitamente la direttiva autoindex in ogni blocco server o location che serve directory controllate dagli utenti.
location /uploads/ {
autoindex off;
# Serve individual files but never list directory contents
}La soluzione più sicura è archiviare upload, backup e log in una directory che il web server non serve affatto. L'applicazione legge e invia i file tramite una route autenticata — il percorso grezzo sul filesystem non è mai raggiungibile.
Non mettere mai upload degli utenti o backup nella directory public/. Servili tramite una route API che possa imporre l'autenticazione e sanificare il percorso richiesto.
// 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);
}Se ti serve davvero un'interfaccia navigabile per i file (una libreria multimediale, un visualizzatore di log interno), proteggi il percorso con l'autenticazione invece di affidarti all'oscurità.
location /logs/ {
autoindex on;
auth_basic "Internal only";
auth_basic_user_file /etc/nginx/.htpasswd;
}FAQ
Il directory listing è sempre un problema, o solo su certi percorsi?
È un problema ovunque i file contengano qualcosa di sensibile. Una CDN pubblica che serve immagini statiche con l'indicizzazione attiva di solito è innocua; /logs/, /backup/ e /uploads/ quasi mai, perché accumulano file non verificati per l'accesso pubblico.
Posso semplicemente mettere un index.html vuoto nella directory per bloccare il listing?
Così nascondi il listing di quella sola directory, ma ogni sottodirectory resta aperta. È anche facile dimenticarsene quando si creano nuove directory. Disattivare autoindex a livello di server è una correzione affidabile, a livello di configurazione, che copre tutto ciò che sta sotto.
Quale severità segnala AppSafe per un indice di directory aperto?
Media. Il listing in sé non è la compromissione — è la strada verso di essa. Una directory /backup/ navigabile con un dump del database o una directory /logs/ con token di autenticazione in chiaro va rapidamente oltre la severità media.
La tua app è interessata?
AppSafe controlla questo e decine di altri problemi in un'unica scansione gratuita.
Scansiona la mia app gratisGuide correlate
Backup del database esposti: cosa succede quando /backup.sql è raggiungibile
Un dump .sql raggiungibile equivale a consegnare l'intero database.
Directory .git esposta: la fuga di codice sorgente nascosta in bella vista
Una /.git raggiungibile consegna l'intero codebase e la cronologia dei commit.
Pagine di errore dettagliate e stack trace in produzione
Uno stack trace dice agli attaccanti esattamente dove mirare.