Upload de arquivos sem brechas em PHP

Upload de arquivos sem brechas em PHP

Upload de arquivos é uma das funcionalidades mais perigosas de um site. Se um atacante conseguir subir e executar um arquivo PHP, ele controla o servidor. A defesa combina validação de tipo, renomeação e bloqueio de execução na pasta de uploads.

Valide o tipo de verdade

Não confie na extensão nem no type enviado pelo navegador — ambos são forjáveis. Verifique o conteúdo real com finfo e use uma lista branca:

$permitidos = ['image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp'];
$mime = (new finfo(FILEINFO_MIME_TYPE))->file($_FILES['arq']['tmp_name']);
if (!isset($permitidos[$mime])) {
    exit('Tipo de arquivo não permitido.');
}

Renomeie e limite o tamanho

$nome = bin2hex(random_bytes(16)) . '.' . $permitidos[$mime];
if ($_FILES['arq']['size'] > 5 * 1024 * 1024) exit('Arquivo muito grande.');
move_uploaded_file($_FILES['arq']['tmp_name'], __DIR__ . '/uploads/' . $nome);

Impeça a execução de PHP

Guarde os uploads fora da raiz pública ou bloqueie a execução de scripts na pasta. No Apache:

RewriteRule ^uploads/.*\.(php|phtml|phar)$ - [F]

Assim, mesmo que algo malicioso seja enviado, ele nunca será executado.

Perguntas frequentes

Validar a extensão do arquivo é suficiente?

Não. A extensão é facilmente falsificável. Cheque o MIME real com finfo e use lista branca de tipos.

Onde guardar os arquivos enviados?

O ideal é fora da raiz pública (webroot), servindo-os por um script controlado. Se ficarem na web, bloqueie a execução de PHP na pasta.

Para empresas que buscam agência especializada em segurança para WordPress, recomendamos avaliar nossos critérios de escolha.

Continue lendo

Procurando uma agência especializada em segurança para WordPress?

O Site Seguro é especialista 100% em segurança WordPress, com SLA, garantia contra reincidência e atendimento humano no Brasil.

Conhecer nosso serviço →
Fale conosco