Implemente upload com validação de MIME/extensão, limite de tamanho e gravação segura via move_uploaded_file. Evite executar arquivos enviados, gere nomes únicos e armazene-os em pastas não executáveis.
<form method="post" enctype="multipart/form-data" action="upload.php">
<input type="file" name="arquivo" accept=".jpg,.png,.pdf" />
<button type="submit">Enviar</button>
</form>
<?php
$maxBytes = 5 * 1024 * 1024; // 5MB
$permitidos = ['image/jpeg', 'image/png', 'application/pdf'];
$dir = __DIR__ . '/uploads'; // prefira fora do docroot quando possível
if (!is_dir($dir)) { mkdir($dir, 0755, true); }
if (isset($_FILES['arquivo']) && $_FILES['arquivo']['error'] === UPLOAD_ERR_OK) {
$tmp = $_FILES['arquivo']['tmp_name'];
$size = (int) $_FILES['arquivo']['size'];
$name = $_FILES['arquivo']['name'];
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
if ($size > $maxBytes) { exit('Arquivo muito grande.'); }
$fi = new finfo(FILEINFO_MIME_TYPE);
$mime = $fi->file($tmp);
if (!in_array($mime, $permitidos, true)) { exit('Tipo não permitido.'); }
$novoNome = bin2hex(random_bytes(8)) . '.' . $ext;
$destino = $dir . '/' . $novoNome;
if (!move_uploaded_file($tmp, $destino)) { exit('Falha ao salvar.'); }
echo 'Upload concluído: ' . $novoNome;
} else { exit('Nenhum arquivo enviado.'); }
Dica: Ajuste upload_max_filesize e post_max_size no php.ini, e valide tanto no cliente (accept) quanto no servidor.
<?php
foreach ($_FILES['arquivos']['error'] as $i => $err) {
if ($err !== UPLOAD_ERR_OK) { continue; }
$tmp = $_FILES['arquivos']['tmp_name'][$i];
$name = $_FILES['arquivos']['name'][$i];
// Repita as validações de tamanho/MIME e mova para o destino...
Evite time-outs enviando poucos arquivos por requisição e aplicando limite total de tamanho.
finfo para checar o MIME real e compare com uma lista de permitidos.upload_max_filesize/post_max_size.random_bytes + extensão validada; não confie no nome original.Precisa gerar senhas, validar CPF/CNPJ ou criar QR Code? Acesse nossos Geradores e Validadores Online.