Implementação Segura
Estrutura de Segurança Abrangente para Upload de Arquivos
Estratégia de Implementação Segura
graph TD
A[Solicitação de Upload de Arquivo] --> B[Validação no Cliente]
B --> C[Validação no Servidor]
C --> D[Verificação do Tipo de Arquivo]
D --> E[Verificação do Tamanho do Arquivo]
E --> F[Sanitizar Nome do Arquivo]
F --> G[Gerar Nome de Arquivo Único]
G --> H[Armazenar em Local Seguro]
H --> I[Definir Permissões Estritas]
Técnicas de Validação
Abordagem de Validação Multicamadas
| Camada de Validação |
Mecanismo de Segurança |
| Cliente |
Verificações Básicas Iniciais |
| Servidor |
Validação Abrangente |
| Sistema de Arquivos |
Controles de Permissão Estritos |
Implementação Segura em Python
import os
import magic
from werkzeug.utils import secure_filename
import uuid
class FileUploadHandler:
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'pdf'}
MAX_FILE_SIZE = 5 * 1024 * 1024 ## 5MB
@staticmethod
def validate_file(file_stream):
## Verificar tamanho do arquivo
file_stream.seek(0, os.SEEK_END)
file_size = file_stream.tell()
file_stream.seek(0)
if file_size > FileUploadHandler.MAX_FILE_SIZE:
raise ValueError("Arquivo muito grande")
## Verificar tipo de arquivo usando magic
file_type = magic.from_buffer(file_stream.read(2048), mime=True)
file_stream.seek(0)
tipos_mime_permitidos = {
'image/jpeg',
'image/png',
'application/pdf'
}
if file_type not in tipos_mime_permitidos:
raise ValueError("Tipo de arquivo inválido")
@staticmethod
def secure_filename(filename):
## Sanitizar nome do arquivo
nome_sanitizado = secure_filename(filename)
## Gerar nome de arquivo único
nome_unico = f"{uuid.uuid4()}_{nome_sanitizado}"
return nome_unico
@staticmethod
def save_file(file_stream, upload_directory):
## Validar arquivo
FileUploadHandler.validate_file(file_stream)
## Gerar nome de arquivo seguro
nome_arquivo = FileUploadHandler.secure_filename(file_stream.filename)
## Caminho completo do arquivo
caminho_arquivo = os.path.join(upload_directory, nome_arquivo)
## Salvar arquivo com permissões restritas
with open(caminho_arquivo, 'wb') as f:
f.write(file_stream.read())
## Definir permissões de arquivo seguras
os.chmod(caminho_arquivo, 0o640)
Fortalecimento de Permissões de Arquivos Bash
#!/bin/bash
## Diretório de upload seguro
DIR_UPLOAD="/var/www/uploads"
## Criar diretório com permissões restritas
mkdir -p "$DIR_UPLOAD"
chown www-data:www-data "$DIR_UPLOAD"
chmod 750 "$DIR_UPLOAD"
## Definir ACL padrão para novos arquivos
setfacl -d -m u::rw,g::r,o::- "$DIR_UPLOAD"
Considerações de Segurança Avançadas
Estratégias de Armazenamento de Arquivos
- Armazenar arquivos carregados fora da raiz web
- Usar volumes de armazenamento separados
- Implementar registro de acesso
Permissões Recomendadas
- Usuário do servidor web: Leitura/Escrita
- Grupo: Somente Leitura
- Outros: Sem acesso
Recomendações de Segurança LabEx
No LabEx, enfatizamos uma abordagem holística para a segurança de upload de arquivos, combinando várias camadas de validação e controles de acesso rigorosos.
Princípios de Implementação Chave
- Nunca confie em entradas do usuário
- Validar em várias camadas
- Usar bibliotecas seguras
- Implementar modelos de permissão rigorosos
- Registrar e monitorar atividades de upload de arquivos