Fix/correcoes seguranca - #719
Merged
Merged
Conversation
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (7)
📝 WalkthroughWalkthroughChangesAuthentication and avatar flow
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant DashboardForm
participant AvatarRoute
participant checkAuth
participant Cloudinary
DashboardForm->>AvatarRoute: POST multipart avatar
AvatarRoute->>checkAuth: Authenticate with ROLE_GROUPS.ALL
checkAuth-->>AvatarRoute: Return authorization result
AvatarRoute->>Cloudinary: Upload validated image
Cloudinary-->>AvatarRoute: Return secure URL
AvatarRoute-->>DashboardForm: Return data.url
DashboardForm->>DashboardForm: Update form state
Possibly related PRs
Suggested reviewers: ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
karinaperes
added a commit
that referenced
this pull request
Aug 19, 2026
Fix/correcoes seguranca (#719)
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📋 Descrição
Fecha três brechas de segurança encontradas na auditoria técnica do projeto.
/api/metricsnunca era acionada.🔗 Issue relacionada
Não há issue pública. Achados de segurança são tratados fora do repositório até
a correção, para não divulgar a falha antes do conserto.
✅ Alterações realizadas
1. Hash de senha deixa de sair do banco
Antes: nenhuma das rotas usava
selectouomit, então o objetoUseriainteiro para o JSON — com o campo
password. O caso mais grave eraGET /api/user/[id], liberado para todos os papéis: qualquer pessoa autenticadalia o hash de qualquer outra informando o id.
Agora:
src/lib/prisma.tsdeclaraomit: { user: { password: true } }nocliente. O campo deixa de ser retornado por padrão em todas as consultas, e a
proteção passa a valer para código futuro sem depender de ninguém lembrar.
A única exceção é explícita e localizada — a validação de login em
src/lib/auth.tspedeomit: { password: false }, com comentário explicando oporquê.
No mesmo arquivo, o log de queries do Prisma passou a ser condicionado ao
ambiente. Antes
log: ['query']era incondicional, o que em produção significaregistrar toda query com seus valores — custo de I/O, ruído nos logs e dado de
usuário espalhado pelo provedor.
2. Guarda de administrador de
/api/metricscheckAuthsempre devolve um objeto —{ authorized: false, response }aonegar e
{ authorized: true, session }ao permitir. Nunca devolvenull. Oteste
if (!session)verificava a existência do objeto, não a autorização, e arota respondia a qualquer requisição — inclusive anônima — entregando métricas de
negócio: crescimento de usuários por mês e por papel, skills, stacks, projetos e
taxa de uso dos convites.
Verificado que nenhuma outra rota tem o mesmo defeito.
3. Upload de avatar
A rota não chamava
checkAuth, não validava tipo nem tamanho e enviava o bufferdireto para o Cloudinary da organização. Qualquer pessoa na internet podia
consumir a cota da conta ou hospedar arquivos sob o domínio do projeto.
Passou a exigir:
image/png,image/jpegeimage/webp;resource_type: 'image'no Cloudinary;public_idigual ao id do usuário — cada conta sobrescreve apenas o próprioavatar, em vez de poder gravar em qualquer caminho da pasta.
Erros passaram a usar
buildResponseelogger, como na rota irmã/api/upload/ui-assets, que já fazia a verificação corretamente.🧪 Como testar
omitemauth.ts; sefalhar, o hash não está chegando à validação de senha.
/dashboard/profile) e no painel de admin./api/metricsdeslogada → deve responder 401:curl -i -X POST http://localhost:3000/api/upload/avatar -F "file=@foto.png".pdfpara.pnge tentar enviar; deveser recusado com 400.
password:📷 Evidências
Os 110 erros restantes são pré-existentes, concentrados em arquivos de teste, e
não têm relação com estas alterações.
O contrato do upload de avatar mudou. A rota passou a responder no formato
padrão do projeto —
{ success, message, data: { url } }— em vez de{ url }. Os três componentes que consomem foram atualizados:UserEdit.tsx,EditUserAdminForm.tsxeUserAdminForm.tsx. Vale testar atroca de avatar nos dois lugares antes do merge.
O
omitglobal é a mudança de maior alcance. Ele afeta todas as consultasa
Userno projeto. A suíte passa e o build compila, mas os testes mockam oPrisma — por isso os passos 1, 2 e 3 do roteiro acima importam.
Encontrado no caminho: ao escrever a validação do upload, o TypeScript
acusou
auth.sessioncomo possivelmente indefinido mesmo apósif (!auth.authorized) return. É o comportamento que a tarefa REF-04 dobacklog descreve: o tipo de retorno de
checkAuthnão estreita, e permiteacessar
sessionsem verificarauthorized— foi exatamente assim que odefeito de
/api/metricssurgiu. Aqui foi seguido o padrão já usado pelasdemais rotas; a correção de fundo fica para a tarefa específica.
Fora do escopo deste PR: as demais brechas mapeadas na auditoria — IDOR em
project-stackeproject-skill, e injeção de HTML no e-mail de contato.Serão tratadas separadamente.
✔️ Checklist
ARQ
echo "escrito: $SP/pr-correcoes-seguranca.md" && wc -l "$SP/pr-correcoes-seguranca.md"
Summary by CodeRabbit
New Features
Bug Fixes