Pular para o conteúdo
Todos os conceitos

Atribuição em massa

Quando o servidor copia todos os campos do pedido para o modelo, um campo extra (role) muda o que não devia.

Para salvar um formulário, é tentador copiar o corpo do pedido direto para o objeto guardado, de uma vez:

Object.assign(account, body);   // copia TODA chave do body

O formulário mostra só displayName e plot, então o programador assume que o corpo só traz esses campos. Mas o corpo é controlado pelo cliente: nada impede mandar um campo a mais, como role. Se o objeto tem um campo role, o merge o sobrescreve, e o usuário vira admin por conta própria. Isso é atribuição em massa (mass assignment): ligar o pedido inteiro no modelo sem filtrar.

PATCH /api/profile   {"displayName":"Ana","role":"admin"}

O conserto é uma lista de permissão dos campos que o usuário pode mudar, e nunca aceitar os campos sensíveis (role, is_admin, balance) por essas rotas. Frameworks dão nome a isso: "strong parameters" no Rails, fields/exclude em serializers do Django REST. Em Python, o erro gêmeo é user.__dict__.update(request.json).

Formulário displayName plot Corpo do pedido displayName plot role: admin campo a mais Conta guardada displayName plot role: admin copia tudo virou admin
O formulário só tem dois campos, mas o cliente manda role=admin junto; o merge copia tudo e o campo extra vira privilégio.

Aparece nestes desafios