APIs e requisições
Ataques que abusam do formato de uma requisição ou da confiança que um navegador deposita no seu site. São fáceis de passar despercebidos porque o cliente normal nunca os envia.
Checklist
- Proteja requisições que alteram estado contra CSRF. Se você autentica com cookies, todo endpoint que altera estado precisa de um token CSRF ou de uma política de cookie SameSite estrita. Se você autentica com um bearer token em um cabeçalho Authorization (e não com um cookie automático), o CSRF clássico não se aplica, o que é um dos motivos para preferi-lo.
- Feche o login-CSRF. Até o fluxo de login pode ser forjado: vincule o
statedo OAuth ao navegador com um cookie definido no início e verificado no callback. Veja autenticação. - Restrinja o CORS. Nunca reflita um
Originarbitrário e nunca envieAccess-Control-Allow-Origin: *com credenciais. Use uma allowlist explícita de origens e apenas os métodos e cabeçalhos de que você precisa. Um "permitir tudo" padrão é um erro comum de scaffold. - Impeça o mass assignment. Não repasse o corpo da requisição diretamente para uma atualização no banco de dados. Aceite uma allowlist explícita de campos graváveis, para que um usuário não consiga enviar
{"role":"admin"}ou{"plan":"enterprise"}e escalar privilégios. Marque campos somente leitura e ignore os desconhecidos. - Conceda privilégios e estado de pagamento somente a partir de um evento confiável. Um plano ou saldo de créditos deve mudar por meio de um webhook de pagamento verificado ou de uma ação de administrador, nunca por um valor enviado em uma requisição do usuário.
- Verifique os webhooks. Confira a assinatura do provedor sobre o corpo bruto, confirme que o valor e a moeda correspondem ao esperado e torne cada evento idempotente, para que um replay não seja aplicado duas vezes.
- Valide content types e tamanhos. Rejeite content types inesperados e limite o tamanho do corpo antes de fazer o parse.
Como testar
- Adicione
role,is_admin,planoucreditsa uma requisição de atualização e confirme que o servidor os ignora. - Envie uma requisição cross-origin e confirme que o CORS não reflete a sua origem.
- Reenvie um webhook duas vezes e confirme que ele é aplicado uma única vez.