Garantindo que apenas arquivos permitidos sejam enviados no PHP

Métodos para restringir uploads de arquivos no PHP, garantindo que apenas formatos seguros sejam aceitos e protegendo o servidor contra ameaças.

Introdução

Permitir que usuários enviem arquivos para um servidor pode ser um risco de segurança se não houver restrições adequadas. Sem uma validação rigorosa, atacantes podem enviar arquivos maliciosos, como scripts PHP, que podem ser executados no servidor e comprometer a aplicação.

1. Criando uma lista de formatos permitidos

A primeira etapa para restringir uploads é definir quais tipos de arquivos são aceitos:

$tipos_permitidos = ['image/jpeg', 'image/png', 'application/pdf'];
if (!in_array($_FILES['arquivo']['type'], $tipos_permitidos)) {
    die('Tipo de arquivo não permitido!');
}

Isso impede que arquivos potencialmente perigosos, como .php e .exe, sejam enviados.

2. Verificando a extensão do arquivo

Apenas verificar o tipo MIME não é suficiente, pois um invasor pode alterar os cabeçalhos do arquivo. Devemos verificar também a extensão:

$extensoes_permitidas = ['jpg', 'jpeg', 'png', 'pdf'];
$extensao = strtolower(pathinfo($_FILES['arquivo']['name'], PATHINFO_EXTENSION));
if (!in_array($extensao, $extensoes_permitidas)) {
    die('Extensão de arquivo não permitida!');
}

Isso adiciona uma camada extra de segurança ao processo de validação.

3. Bloqueando execução de arquivos maliciosos

Mesmo que um arquivo passe na verificação, ele não deve ser executado no servidor. Podemos evitar isso desativando a execução de PHP no diretório de uploads com .htaccess:

<FilesMatch ".(php|phtml|php3|php4|php5|phps)$">
    Deny from all
</FilesMatch>

Isso impede que arquivos PHP enviados sejam acessados via navegador.

4. Limitando o tamanho dos arquivos

Para evitar que usuários enviem arquivos gigantes e sobrecarreguem o servidor, podemos definir limites de tamanho no php.ini:

upload_max_filesize = 2M
post_max_size = 3M

Isso garante que apenas arquivos de tamanho adequado sejam aceitos.

5. Armazenando arquivos com nomes seguros

Para evitar ataques por sobrescrita de arquivos, podemos gerar um nome único para cada upload:

$novo_nome = uniqid() . '.' . $extensao;
move_uploaded_file($_FILES['arquivo']['tmp_name'], '/var/www/uploads/' . $novo_nome);

Isso impede que um invasor tente substituir arquivos existentes com conteúdo malicioso.

Conclusão

Garantir que apenas arquivos permitidos sejam carregados no PHP é essencial para evitar ataques e manter a segurança da aplicação. Implementar validação de tipo MIME, extensão, tamanho e desativar execução de scripts no diretório de uploads são práticas fundamentais para proteger o sistema.

O upload de arquivos pode ser uma das principais portas de entrada para ataques em uma aplicação PHP. Sem restrições adequadas, invasores podem enviar arquivos executáveis, explorar falhas na aplicação e comprometer o servidor.

Uma abordagem segura envolve a validação rigorosa dos arquivos enviados. Isso inclui verificar não apenas a extensão, mas também o tipo MIME e definir um diretório seguro para armazenamento. Além disso, restringir o tamanho máximo dos arquivos evita ataques de negação de serviço.

Ao combinar essas técnicas, podemos minimizar riscos e garantir que apenas arquivos seguros sejam processados pelo sistema. Implementar essas medidas de segurança desde o início do desenvolvimento pode evitar grandes problemas no futuro.

Algumas aplicações:

  • Evitar que scripts maliciosos sejam carregados no servidor.
  • Proteger contra ataques baseados em upload de arquivos.
  • Garantir que apenas formatos de arquivos seguros sejam aceitos.
  • Prevenir sobrecarga do servidor causada por arquivos grandes.

Dicas para quem está começando

  • Sempre valide o tipo MIME e a extensão do arquivo.
  • Renomeie os arquivos enviados para evitar conflitos.
  • Use .htaccess para impedir execução de arquivos maliciosos.
  • Defina um limite de tamanho para os uploads no php.ini.
  • Crie um diretório específico para armazenar arquivos de upload e restrinja seu acesso.

Contribuições de Gustavo Ferraz

Compartilhe este tutorial: Como garantir que apenas arquivos permitidos sejam carregados no PHP?

Compartilhe este tutorial

Continue aprendendo:

Como impedir ataques de spoofing de cabeçalhos HTTP no PHP?

Métodos para impedir ataques de spoofing de cabeçalhos HTTP no PHP, protegendo a aplicação contra falsificação de identidade e acesso não autorizado.

Tutorial anterior

Como usar Content Security Policy (CSP) para aumentar a segurança em aplicações PHP?

Métodos para implementar Content Security Policy (CSP) no PHP, evitando ataques de injeção de scripts maliciosos e reforçando a segurança da aplicação.

Próximo tutorial