Índices de diretório abertos: quando o seu servidor de arquivos lista tudo
Quando a indexação de diretórios está ativada, visitar um caminho como /uploads/ retorna uma lista navegável de todos os arquivos daquele diretório em vez de um 403 ou 404. Atacantes olham aqui primeiro porque arquivos de backup, logs e conteúdo enviado por usuários costumam ficar legíveis para qualquer um dentro de diretórios servidos pela web.
O que é
A listagem de diretórios (também chamada de indexação de diretórios) é um recurso do servidor web que gera um navegador de arquivos em HTML quando um diretório é requisitado e não há arquivo index. Ativada por padrão em algumas configurações do nginx (autoindex on) e no Apache (Options +Indexes), é uma conveniência para hosts estáticos que vira um risco em qualquer lugar onde os arquivos não deveriam ser públicos.
O AppSafe verifica um conjunto de caminhos frequentemente mal configurados — /uploads/, /files/, /backup/, /backups/, /logs/ e /tmp/ — e sinaliza qualquer um que retorne uma resposta reconhecível de listagem de diretório. Um único diretório aberto pode expor dados que nunca deveriam ser descobertos.
Por que importa
Diretórios expostos costumam conter arquivos enviados por usuários, dumps de banco de dados compactados, logs da aplicação com credenciais ou tokens de sessão e arquivos de código que sobraram de deploys. Encontrá-los não exige autenticação nem exploração — basta digitar a URL.
Scanners automatizados testam continuamente os mesmos caminhos conhecidos que o AppSafe verifica, em todo host acessível. Um diretório /backup/ aberto com um dump .sql.gz equivale a entregar uma exportação completa do banco de dados sem senha.
Como corrigir
Remova ou desative explicitamente a diretiva autoindex em qualquer bloco server ou location que sirva diretórios controlados por usuários.
location /uploads/ {
autoindex off;
# Serve individual files but never list directory contents
}A correção mais segura é armazenar uploads, backups e logs num diretório que o servidor web não serve de forma alguma. A sua aplicação lê e transmite os arquivos por uma rota autenticada — o caminho bruto no sistema de arquivos nunca fica acessível.
Nunca coloque uploads de usuários ou backups dentro do diretório public/. Sirva-os por uma rota de API que possa exigir autenticação e sanitizar o caminho requisitado.
// 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 você realmente precisa de uma interface de arquivos navegável (uma biblioteca de mídia, um visualizador de logs interno), proteja o caminho com autenticação em vez de contar com a obscuridade.
location /logs/ {
autoindex on;
auth_basic "Internal only";
auth_basic_user_file /etc/nginx/.htpasswd;
}FAQ
A listagem de diretórios é sempre um problema ou só em certos caminhos?
É um problema sempre que os arquivos contêm algo sensível. Uma CDN pública servindo imagens estáticas com indexação ativada costuma ser inofensiva; /logs/, /backup/ e /uploads/ quase nunca são, porque acumulam arquivos que não foram avaliados para acesso público.
Posso colocar um index.html vazio no diretório para bloquear a listagem?
Isso esconde a listagem daquele diretório, mas deixa todos os subdiretórios abertos. Também é fácil esquecer quando novos diretórios são criados. Desativar o autoindex no nível do servidor é uma correção confiável, de configuração, que cobre tudo abaixo dele.
Que severidade o AppSafe reporta para um índice de diretório aberto?
Média. A listagem em si não é o comprometimento — é o caminho até ele. Um diretório /backup/ navegável com um dump de banco de dados, ou um diretório /logs/ com tokens de autenticação em texto puro, rapidamente passa da severidade média por conta própria.
Seu app está afetado?
O AppSafe verifica isso e dezenas de outros problemas em um único escaneamento grátis.
Escanear meu app grátisGuias relacionados
Backups de banco de dados expostos: o que acontece quando /backup.sql está acessível
Um dump .sql acessível é a entrega completa de todo o seu banco de dados.
Diretório .git exposto: o vazamento de código-fonte à vista de todos
Um /.git acessível entrega todo o seu código e o histórico de commits.
Páginas de erro detalhadas e stack traces em produção
Um stack trace mostra ao atacante exatamente onde mirar.