Pular para o conteúdo

Segurança de API

O OWASP API Top 10, e o BOLA — a falha mais comum de uma API — escrita e corrigida.

A falha número um de API não é injeção nem criptografia: é autorização por objeto (BOLA). A rota confere que o usuário está logado, e não que o pedido /pedidos/43 é dele. Trocar o número na URL mostra o pedido de outra pessoa.

dataforge
adopt Kiln

pedidos := {
    "42": {"id": "42", "dono": "ana", "total": 120},
    "43": {"id": "43", "dono": "bia", "total": 900}
}

// Quem e o usuario sai do TOKEN, e nunca do corpo ou da query.
// O Kiln entrega os cabecalhos em minusculas, como o HTTP/2 os escreve.
action usuario_de(cabecalhos):
    yield {"t-ana": "ana", "t-bia": "bia"}[cabecalhos["authorization"] ?? ""] ?? void

server api on 0:
    route GET "/pedidos/:id":
        quem := usuario_de(headers)
        given quem is void:
            respond 401 json {"erro": "entre primeiro"}
        p := pedidos[params["id"]] ?? void
        // 404 tambem para o pedido de OUTRA pessoa: 403 confirmaria que existe.
        given p is void or p["dono"] isnt quem:
            respond 404 json {"erro": "pedido nao encontrado"}
        respond json p

assert Kiln.test(api, "GET", "/pedidos/42", void, {"Authorization": "t-ana"})["status"] is 200
assert Kiln.test(api, "GET", "/pedidos/43", void, {"Authorization": "t-ana"})["status"] is 404
assert Kiln.test(api, "GET", "/pedidos/42")["status"] is 401
out "BOLA fechado: o dono e conferido por objeto"

O OWASP API Top 10 (2023)#

CategoriaA pergunta em cada rota
API1 — autorização por objeto (BOLA)este objeto é deste usuário?
API2 — autenticação quebradao token é conferido, tem prazo, e o erro não diz qual parte errou?
API3 — autorização por propriedadeo corpo pode mudar papel ou saldo? — aceite uma lista de campos
API4 — consumo sem limiterate_limit, body_limit e paginação com teto?
API5 — autorização por funçãoa rota de administração confere o papel, e não só o login?
API6 — fluxos de negócio sensíveiscomprar 500 ingressos por script é possível?
API7 — SSRFa URL que o cliente manda passa por url_segura?
API8 — configuração insegurasecure_headers, CORS com origem nomeada, erro sem traceback
API9 — inventáriohá uma rota esquecida de uma versão antiga? dataforge api lista todas
API10 — consumo inseguro de APIsa resposta do terceiro é validada como entrada de fora?

Continue em Web e Autorização.