Apresentação
Segurança — studyAI
Requisitos e medidas de segurança: auth, rate limiting, proteção de dados e boas práticas.
Índice
Diagrama: Auth flow
A carregar diagrama…
Autenticação
JWT
- Access token: 15 min. Guardado no frontend (memória ou httpOnly cookie).
- Refresh token: 7 dias. Guardado em DB ou Redis. Hash antes de guardar.
- Algoritmo: HS256 ou RS256.
- Claims:
sub(user_id),exp,iat,type(access|refresh).
Password
- Hash: bcrypt ou argon2. Salt automático.
- Requisitos: Mínimo 8 chars, 1 maiúscula, 1 número, 1 especial (validar no registo).
- Reset: Token único, expira em 1h. Enviar por email (futuro).
HTTPS
- Obrigatório em produção. Redirect HTTP → HTTPS.
- HSTS header.
Autorização
Diagrama: Multi-tenant e isolamento
A carregar diagrama…
Regras: Todas as pesquisas vetoriais exigem project_id. Validação de ownership antes de retrieval/index/delete.
Regras
- Projetos: User só acede aos seus projetos (
project.user_id = current_user.id). - Ficheiros/Documentos: Pertencem ao projeto; herdam permissão do projeto.
- User progress: User só vê o seu progresso.
Implementação
- Middleware ou dependency que extrai
user_iddo JWT. - Em cada endpoint de projeto: verificar
project.user_id == current_user.id. - 403 se não autorizado.
Exemplo (FastAPI)
async def get_project(project_id: UUID, user: User = Depends(get_current_user)):
project = await db.get_project(project_id)
if not project or project.user_id != user.id:
raise HTTPException(403, "Forbidden")
return project
Rate limiting
Objetivo
- Proteger a API de abuso.
- Controlar custos (chamadas LLM são caras).
- Garantir fair use entre utilizadores.
Estratégia
| Endpoint | Limite | Janela |
|---|---|---|
| /auth/login | 5 req | 15 min |
| /auth/register | 3 req | 1 h |
| /projects/:id/chat | 30 req | 1 min |
| /projects/:id/generate | 5 req | 1 h |
| /projects/:id/evaluate | 60 req | 1 min |
| Resto (CRUD) | 100 req | 1 min |
Implementação
- Redis: Sliding window ou fixed window. Key:
ratelimit:{user_id}:{endpoint}. - Resposta 429:
Retry-Afterheader. - Por plano: Utilizadores premium podem ter limites maiores (futuro).
Proteção de dados
Em trânsito
- HTTPS em tudo.
- Tokens nunca em query params (apenas header ou cookie).
Em repouso
- Passwords: Hash, nunca plain text.
- Tokens: Refresh token em hash.
- Ficheiros: Storage com encryption at rest (S3/ R2 default).
- DB: Encryption at rest (PostgreSQL, cloud providers).
PII
- Email: Necessário para auth. Não expor em logs.
- Nome: Opcional. Tratar como PII.
- Conteúdo dos ficheiros: Dados do utilizador. Não usar para treino; não partilhar entre users.
LGPD/GDPR (futuro)
- Política de privacidade.
- Direito ao esquecimento (apagar conta + dados).
- Export de dados.
- Consent para cookies/analytics.
API e inputs
Validação
- Pydantic: Validar todos os inputs. Rejeitar malformados.
- Tamanhos: Limitar tamanho de mensagens (ex: 10k chars), ficheiros (ex: 50MB).
- Tipos de ficheiro: Whitelist (PDF, TXT, MD). Rejeitar executáveis, etc.
Prompt injection
- RAG: Chunks do user podem conter texto malicioso. Instruir LLM a ignorar instruções nos chunks.
- Chat: User pode tentar "Ignore previous instructions". Prompt com system message claro: "Responde apenas sobre o material do projeto."
- Avaliação: Não confiar cegamente em output do LLM para decisões críticas.
CORS
- Restringir origens em produção. Ex:
https://app.studyai.example. - Dev:
localhost:3000.
Logs e auditoria
O que logar
- Auth: Login (sucesso/falha), registo. Sem passwords.
- Ações sensíveis: Criação de projeto, upload, delete.
- Erros: Stack trace em dev; mensagem genérica em prod.
- Rate limit: Quando 429 é devolvido.
O que não logar
- Passwords, tokens.
- Conteúdo completo de mensagens (opcional: só IDs e timestamps).
- PII em plain text.
Formato
- Estruturado (JSON). Campos:
timestamp,level,message,user_id,request_id,extra.
Multi-tenant / Isolamento
Regras obrigatórias
-
Filtro project_id em todas as pesquisas vetoriais
- Retrieval:
WHERE project_id = :project_id(obrigatório) - Nunca fazer similarity search sem filtro de projeto
- Retrieval:
-
Validação de ownership antes de qualquer operação
- GET/POST/PUT/DELETE em projects, files, documents:
project.user_id == current_user.id - Retrieval, index, delete: verificar que resource pertence ao projeto do user
- GET/POST/PUT/DELETE em projects, files, documents:
-
Estratégia contra leakage cross-project
- Nunca devolver chunks de outro projeto
- Logs: não incluir conteúdo de outros users
- Testes: criar 2 projetos, user A não deve ver dados de projeto de user B
Testes específicos
- User A cria projeto, faz upload. User B não vê ficheiros de A.
- Query em projeto A não devolve chunks de projeto B.
- DELETE project remove apenas chunks desse projeto.
Checklist
| Item | Status |
|---|---|
| JWT com expiração curta | |
| Refresh token em hash | |
| Password com hash forte | |
| Verificação de ownership em projetos | |
| Rate limiting em endpoints críticos | |
| HTTPS em produção | |
| Validação de inputs (Pydantic) | |
| Limite de tamanho de ficheiros | |
| CORS configurado | |
| Logs sem PII/tokens | |
| Prompt injection mitigado |
Zona de prática
Sem perguntas. Clica em Editar para adicionar.