Eu tenho um site onde os usuários podem depositar arquivos. Não quero que esses arquivos sejam acessíveis a ninguém.
Eu vi que algumas pessoas criam uma pasta (digamos my_secret_folder
) no mesmo nível do www
diretório. Em seguida, eles carregam arquivos (com script PHP) usando:
$destination = $_SERVER['DOCUMENT_ROOT']."/../my_secret_folder/".$filename
onde $destination
é o caminho completo do arquivo carregado.
Então, apenas um script PHP (de dentro da pasta www) permite acessar o arquivo.
Esta é uma boa prática?
Sim, é uma boa prática. Colocá-lo fora do webroot significa que os arquivos não serão expostos publicamente por um simples erro de configuração no servidor web, adicionando assim outra barreira à exposição - e tem custo zero para implementar.
Supondo que este seja um servidor apache, você já pensou em colocar restrições no diretório?
Não mostre uma lista de arquivos se alguém tentar navegar no diretório e limitar um HTML GET para alguém logado como administrador.
Isso já foi sugerido em um comentário de @Voo, mas esse ponto é tão importante que acho que deveria ser movido para uma caixa de resposta.
Esta é uma boa prática se, e somente se , o usuário da web não puder controlar
$filename
. Caso contrário, é uma vulnerabilidade de path traversal .Considere o que acontece se o cliente criar uma solicitação especial onde
$filename
is../www/index.php
. Você acabou de permitir que seu uploader substitua o código de seu aplicativo da web.Resista à tentação de resolver esse problema colocando na lista negra valores como
/
e..
: há maneiras de contornar isso, o link acima lista alguns. A solução canônica para esse problema é (a) escolher você mesmo os nomes dos arquivos ou (b) ter uma lista branca explícita de caracteres permitidos.