Eu pessoalmente não sou fã da abordagem que você descreveu, pois você pode acabar com falsos positivos se houver um ponto na URL real de um arquivo .php.
Geralmente, existem três abordagens para evitar instruir o nginx a executar arquivos arbitrários. Eu os listei na minha ordem preferida.
# 1 é configurar o PHP com cgi.fix_pathinfo
definido como 0. Isso fará com que, mesmo que alguém passe uma URL de /uploads/avatar32.jpg/index.php
, o PHP procurará esse arquivo em vez de tentar "corrigir" o caminho e execute /uploads/avatar32.jpg
. Se o caminho de arquivo completo não for encontrado, ele retornará o erro "nenhum arquivo de entrada especificado" ou "script primário desconhecido" dependendo da sua versão do PHP.
# 2 é testar nginx para a existência de um arquivo real e, se não for encontrado, retornar 404. No entanto, isso não funcionará se você estiver usando o nginx como um proxy reverso / balanceador de carga para seus servidores PHP. Sua localização no PHP acabaria parecendo:
location ~* \.php$ {
try_files $uri =404;
fastcgi_pass backend;
}
# 3 é a abordagem da lista negra que aproveita o fato de que essa vulnerabilidade só funciona se o invasor puder fazer o upload de arquivos para o servidor. Por exemplo, se os envios dos usuários forem enviados / uploads /, você terá um local específico para isso.
location /uploads {
location ~ \.php$ {return 403;}
}