Um aplicativo de notas permite que Alice salve o “Rascunho do orçamento trimestral” como nota 1. Bob faz login em sua própria conta, solicita GET /notes/1 e recebe a nota de Alice, pois o servidor verifica se Bob está autenticado, mas nunca verifica se Bob é o proprietário da nota 1. Bob não precisou da senha de Alice nem de acesso especial, apenas de um identificador previsível. Se Bob solicitar a nota 1, a API deveria retornar o conteúdo de Alice? O pequeno exemplo local abaixo mostra a requisição e a resposta inseguras:
Este código retorna o registro JSON da Alice enquanto identifica Bob como o usuário que está realizando a ação. A falha observável é o controle de acesso quebrado (broken access control), situação em que o servidor permite que uma pessoa autenticada execute uma ação fora do escopo de suas permissões. A medida preventiva imediata é uma verificação de propriedade no lado do servidor antes da leitura da nota, e o sinal de detecção é uma entrada de log registrando Bob, a nota 1 e uma decisão de autorização negada. Continuaremos corrigindo esta aplicação de notas, de modo que cada regra de segurança permaneça vinculada a uma requisição, a um trecho de código e a uma forma de verificar a correção.
A ausência da verificação de propriedade é relevante porque o navegador está fora do limite de confiança do servidor da API. Um limite de confiança é o ponto onde a aplicação recebe dados ou instruções que podem ser influenciados por terceiros; portanto, o servidor deve validá-los e aplicar suas próprias regras. O cookie de Bob e o ID da nota solicitada passam de um cliente não confiável para o servidor; a API então envia uma consulta ao banco de dados apenas após tomar a decisão de autorização.
A mesma aplicação possui mais de um ponto de entrada. Um usuário da internet não autenticado pode enviar dados de login ou criar uma nota. Um usuário com privilégios reduzidos, como Bob, pode fornecer IDs e textos de notas após o login. Uma dependência comprometida pode ser introduzida durante o processo de build, quando o registro de pacotes fornece código que o servidor executará posteriormente. Os ativos que precisam ser protegidos são as sessões ativas, as notas da Alice, os segredos do servidor e os logs que registram quais requisições ocorreram. O diagrama acompanha cada entrada até o componente que deve decidir se confia nela: