Muitas vezes uma aplicação pode necessitar exibir ou enviar arquivos para seus usuários. Em especial em sistemas web, existem páginas que recebem um nome de arquivo como parâmetro e exibem o arquivo em questão para o usuário. Um exemplo seria uma URL do tipo http://java.sapao.net/download?file=imagem.gif. Este tipo de parâmetro deve ser evitado pois se um adversário poderia enviar o requisição como http://java.sapao.net/download?file=/etc/passwd e, caso a aplicação não restrinja os arquivos que podem ser solicitados, obter o arquivo de senhas do servidor. Para evitar problemas, a melhor alternativa é montar uma tabela com os nomes dos arquivos que podem ser acessado através da aplicação e atribuir a cada arquivo um identificador único. Desta forma, o máximo que um ataque conseguiria seria baixar um outro arquivo dentre aqueles presentes na lista da aplicação. Ou senão um erro de parâmetro inválido caso o identificador não conste da lista. Neste caso, a URL poderia ser http://java.sapao.net/download?fileId=12345. Caso a definição da lista de arquivos e/ou a atribuição de identificadores não seja possível, é imprescindível configurar com cuidado o usuário sob o qual o servidor de aplicação irá executar e também as permissões deste usuário no sistema de arquivos do servidor, de forma que a aplicação não tenha acesso a arquivos de sistema. Estas configurações são importantes mesmo se a aplicação restringir os arquivos que podem ser solicitados, de forma a se implementar o princípio de segurança em profundidade. |
