Top 10 de segurança da API OWASP: lista de verificação com correções
Percorra todos os 10 riscos de segurança da API OWASP (edição 2023) com cenários reais de ataque, correções concretas e uma lista de verificação de copiar e colar para sua análise de segurança.
Sua API atende 10.000 solicitações por hora. Três dessas solicitações vêm de um invasor que altera
um order_id parâmetro e baixa todos os registros de clientes em seu banco de dados. Você encontra
quando seus usuários o fazem, no Twitter.
O OWASP API Security Top 10 (edição 2023) cataloga os dez riscos responsáveis pela maioria dos
Violações de API. Este guia aborda cada risco com uma explicação de um parágrafo, um ataque realista
cenário e uma solução concreta. Onde um endpoint da API botoi ajuda a detectar ou prevenir o risco, o
endpoint relevante está incluído com um trabalho curl comando.
API1:2023 Autorização em nível de objeto quebrada (BOLA)
BOLA ocorre quando uma API retorna dados com base em um ID de objeto sem verificar se o solicitante
o usuário possui esse objeto. Um invasor chama GET /api/orders/1001, obtém dados e itera
através 1002, 1003, e assim por diante. Cada registro da tabela agora está exposto.
BOLA foi classificada como o risco número um de API desde a primeira lista de segurança de API OWASP em 2019.
Cenário de ataque: Um aplicativo de entrega de comida expõe GET /api/orders/:id.
Um invasor escreve um loop de 1 a 100.000 e baixa todos os pedidos, incluindo endereços de entrega,
números de telefone e detalhes da forma de pagamento.
Aqui está o código vulnerável:
// Vulnerable: no ownership check
app.get("/api/orders/:id", async (req, res) => {
const order = await db.orders.findById(req.params.id);
res.json(order); // Any user can read any order
});
E aqui está a correção:
// Fixed: verify the requesting user owns the resource
app.get("/api/orders/:id", async (req, res) => {
const order = await db.orders.findById(req.params.id);
if (!order) return res.status(404).json({ error: "Not found" });
if (order.userId !== req.user.id) {
return res.status(403).json({ error: "Forbidden" });
}
res.json(order);
});
Cada endpoint que aceita um ID do cliente precisa de uma verificação de propriedade. Sem exceções. Usar
middleware ou um filtro de consulta (por exemplo, WHERE user_id = ?) para impor isso na camada de dados.
API2:2023 Autenticação quebrada
Autenticação quebrada cobre geração de token fraco, validação de token ausente, preenchimento de credenciais ataques e endpoints que aceitam tokens expirados ou adulterados. Os invasores têm como alvo endpoints de login com listas de credenciais violadas ou roubam tokens de armazenamento inseguro.
Cenário de ataque: Um invasor obtém uma lista de 10 milhões de pares de e-mail/senha de
uma violação de dados. Eles escrevem um script que testa cada par em relação ao seu POST /api/login
ponto final. Sua API não tem limite de taxa de tentativas de login, então o invasor compromete 2.000 contas em
uma hora.
Consertar: Aplique limitação de taxa em endpoints de autenticação (5 tentativas por minuto por IP). Exigir autenticação multifator para operações confidenciais. Verifique as credenciais do usuário em relação às conhecidas violações antes de permitir a criação de contas.
O API de verificação de violação do botoi lhe diz se um endereço de e-mail apareceu em violações de dados conhecidas:
curl -s -X POST https://api.botoi.com/v1/breach/check \\
-H "Content-Type: application/json" \\
-d '{
"email": "user@example.com"
}'
Resposta:
{
"success": true,
"data": {
"breached": true,
"count": 3,
"breaches": [
{ "name": "ExampleCorp", "date": "2024-01-15", "dataTypes": ["email", "password"] },
{ "name": "DataDump2023", "date": "2023-08-22", "dataTypes": ["email", "username"] },
{ "name": "LeakedDB", "date": "2022-11-03", "dataTypes": ["email", "phone"] }
]
}
}
Chamar /v1/breach/check durante a inscrição ou redefinição de senha. Se o e-mail aparecer em violações,
solicita que o usuário escolha uma senha exclusiva e mais forte e habilite a autenticação de dois fatores.
API3:2023 Autorização em nível de propriedade de objeto quebrado
Este risco combina atribuição em massa e exposição excessiva de dados. A atribuição em massa acontece quando uma API
vincula campos do corpo da solicitação diretamente a um modelo de dados sem filtragem. Um usuário envia
"role": "admin" em uma atualização de perfil e obtém privilégios elevados. Exposição excessiva de dados
acontece quando uma API retorna campos internos (IDs de banco de dados, senhas com hash, sinalizadores de administrador) do cliente
nunca deveria ver.
Cenário de ataque: Um aplicativo SaaS permite que os usuários atualizem seus perfis por meio de
PUT /api/users/:id. O back-end aceita o corpo completo da solicitação e o grava no banco de dados.
Um invasor adiciona "plan": "enterprise" à solicitação e obtém acesso gratuito a recursos premium.
Consertar: Use listas de permissões explícitas para campos graváveis. Nunca vincule dados brutos de solicitação ao seu modelo de dados. Use DTOs de resposta separados que excluam campos internos. Valide todas as propriedades recebidas em um esquema antes do processamento.
API4:2023 Consumo irrestrito de recursos
APIs que aceitam solicitações ilimitadas permitem que invasores aumentem sua conta de infraestrutura e esgotem o banco de dados
conexões ou acionar negação de serviço. Isso se aplica a limites de taxa ausentes, consulta ilimitada
parâmetros (por exemplo, ?limit=1000000), uploads de arquivos sem limite de tamanho e endpoints que
acionar trabalhos caros em segundo plano.
Cenário de ataque: Um endpoint de API gera relatórios em PDF. Um invasor envia 500 solicitações simultâneas, cada uma solicitando um relatório de 200 páginas. Seu pool de trabalhadores é preenchido e legítimo os usuários recebem 503 erros nos próximos 20 minutos.
Consertar: Adicione limitação de taxa por usuário e por IP. Limite os limites de paginação com o lado do servidor máximos. Defina limites de tamanho para upload de arquivos. Use processamento baseado em fila para operações caras.
// Express rate limiter per user
import rateLimit from "express-rate-limit";
const apiLimiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 30, // 30 requests per minute per IP
standardHeaders: true,
legacyHeaders: false,
message: { error: "Rate limit exceeded. Try again in 60 seconds." },
});
app.use("/api/", apiLimiter);
API5:2023 Autorização de nível de função quebrada
Falhas de autorização em nível de função permitem que usuários regulares liguem para endpoints administrativos. O padrão típico: um
chamadas do painel de administração DELETE /api/admin/users/:id. O frontend oculta o botão de
usuários não administradores, mas o próprio endpoint da API não verifica funções. Qualquer usuário autenticado que
descobre o URL pode excluir contas.
Cenário de ataque: Um desenvolvedor descobre /api/admin/export-all-users
no pacote JavaScript. Eles o chamam com seu token de usuário normal e baixam o usuário completo
banco de dados.
Consertar: Verifique a função do usuário na camada API para cada endpoint administrativo. Não confie em
o frontend para ocultar a funcionalidade. Rotas administrativas de grupo por trás de middleware que verifica
role === "admin" antes de processar a solicitação.
API6:2023 Acesso irrestrito a fluxos de negócios confidenciais
Alguns fluxos de API são perigosos em escala, mesmo quando cada solicitação individual é autorizada. Comprando itens com estoque limitado, criação de contas de teste gratuitas, envio de códigos de referência; esses fluxos quebrar quando automatizado. Um bot inscreve 10.000 contas gratuitas ou compra todos os ingressos em uma venda relâmpago antes que um usuário real carregue a página.
Cenário de ataque: Um revendedor de tênis escreve um bot que liga
POST /api/checkout 500 vezes no primeiro segundo de uma queda limitada. Cada par vende
para bots. Os clientes humanos veem "esgotado" antes que a página termine de carregar.
Consertar: Adicione desafios de CAPTCHA ou prova de trabalho a fluxos de alto valor. Rastrear dispositivo impressões digitais para detectar automação. Defina limites de compra por usuário. Use acesso baseado em fila para vendas flash em vez de endpoints por ordem de chegada.
API7:2023 Falsificação de solicitação do lado do servidor (SSRF)
SSRF acontece quando uma API aceita uma URL do cliente e a busca no lado do servidor sem
validando o alvo. Um invasor fornece http://169.254.169.254/latest/meta-data/
e seu servidor retorna credenciais de instância da AWS. Ou eles têm como alvo
http://localhost:6379/ e interaja com sua instância do Redis.
Cenário de ataque: Uma integração de webhook permite que os usuários especifiquem um URL de retorno de chamada.
Um invasor define o retorno de chamada para http://169.254.169.254/latest/meta-data/iam/security-credentials/
e recebe as credenciais de função IAM do seu provedor de nuvem na carga útil do webhook.
// Block internal network requests
const BLOCKED_RANGES = [
/^10\\./, /^172\\.(1[6-9]|2\\d|3[01])\\./, /^192\\.168\\./,
/^127\\./, /^0\\./, /^169\\.254\\./,
/^localhost$/i, /^\\[::1\\]$/,
];
function isSafeUrl(urlString) {
try {
const url = new URL(urlString);
const hostname = url.hostname;
return !BLOCKED_RANGES.some((re) => re.test(hostname));
} catch {
return false;
}
}
app.post("/api/fetch-url", async (req, res) => {
const { url } = req.body;
if (!isSafeUrl(url)) {
return res.status(400).json({ error: "URL targets a blocked network range" });
}
// proceed with external fetch
});
Consertar: Valide e coloque URLs de destino na lista de permissões. Bloqueie intervalos de IP privados e nuvem pontos de extremidade de metadados. Resolva o DNS antes de fazer a solicitação para evitar a religação do DNS. Executar saída solicitações de um segmento de rede isolado.
API8:2023 Configuração incorreta de segurança
A configuração incorreta é a categoria de risco mais ampla. Inclui restrições CORS ausentes, erro detalhado mensagens que vazam rastreamentos de pilha, credenciais padrão em painéis de administração, métodos HTTP desnecessários habilitados, TLS não aplicado e cabeçalhos de segurança ausentes. Qualquer configuração incorreta cria um ponto de entrada.
Cenário de ataque: Uma API retorna rastreamentos completos de pilha em respostas de erros de produção. Um o invasor aciona erros propositalmente, lê os rastreamentos de pilha, identifica o ORM e a versão do banco de dados, em seguida, cria uma carga útil de injeção com base em vulnerabilidades conhecidas nessa versão.
Consertar: Remova os rastreamentos de pilha das respostas de produção. Configure o CORS para permitir apenas seus domínios. Desative os métodos HTTP que você não usa. Aplique o TLS em todos os lugares. Execute verificações automatizadas de cabeçalho de segurança. Limpe toda a saída HTML para evitar XSS.
O API de limpeza de HTML publicada tiras tags e atributos maliciosos de HTML fornecido pelo usuário:
curl -s -X POST https://api.botoi.com/v1/html-sanitize \\
-H "Content-Type: application/json" \\
-d '{
"html": "<p>Hello</p><script>document.cookie</script><img onerror=alert(1) src=x>"
}'
Resposta:
{
"success": true,
"data": {
"sanitized": "<p>Hello</p><img src=\\"x\\">"
}
}
O <script> etiqueta e o onerror atributo são removidos. O HTML seguro
é retornado. Chame esse endpoint antes de armazenar ou renderizar qualquer HTML fornecido pelo usuário.
API9:2023 Gerenciamento de estoque inadequado
Versões antigas de API, endpoints de teste esquecidos e rotas não documentadas criam uma superfície de ataque para você
não monitore. Os invasores procuram /v1/, /v2/, /api-dev/,
e /internal/ caminhos. Eles encontram um endpoint obsoleto que não possui controles de segurança
você adicionou à versão atual.
Cenário de ataque: Sua equipe enviou /v2/users com acesso baseado em função
controle. Mas /v1/users ainda funciona em produção sem qualquer autorização. Um atacante
descobre o caminho v1 por meio de um arquivo Swagger público e extrai toda a tabela do usuário.
Consertar: Mantenha um inventário completo de APIs. Desative versões antigas; não os deixe executando "caso alguém ainda os use". Guarde todas as versões por trás do mesmo middleware de autenticação. Digitalizar sua própria infraestrutura para caminhos expostos regularmente.
API10:2023 Consumo inseguro de APIs
Sua API chama serviços de terceiros: processadores de pagamento, provedores de e-mail, APIs de geocodificação. Se você confiar em suas respostas sem validação, um terceiro comprometido ou mal-intencionado pode injetar dados em seu sistema. Isso inclui confiar em URLs de redirecionamento, analisar JSON não validado ou armazenar respostas de terceiros sem higienização.
Cenário de ataque: Seu aplicativo busca dados da empresa em uma API de enriquecimento de terceiros
e armazena o company_name campo diretamente em seu banco de dados. A API de enriquecimento obtém
comprometido e o invasor injeta <script> tags em nomes de empresas. Cada
o usuário que visualiza o perfil de uma empresa em seu painel executa o script.
Consertar: Valide e higienize todas as respostas de terceiros antes de armazenar ou renderizar eles. Use a validação de esquema nos dados recebidos. Defina tempos limite em chamadas externas. Aplique a mesma entrada validação para dados de terceiros que você aplica à entrada do usuário.
Detecte a exposição de dados confidenciais nas respostas da sua API
Os riscos API1 e API3 geralmente resultam na saída de dados confidenciais de sua API. O API de detecção de PII botoi verifica o texto em busca Números de segurança social, números de cartão de crédito, endereços de e-mail, números de telefone, endereços IP e datas de nascimento. Execute-o nos corpos de resposta da API em testes de integração para detectar erros acidentais. vazamentos de dados antes da implantação.
curl -s -X POST https://api.botoi.com/v1/pii/detect \\
-H "Content-Type: application/json" \\
-d '{
"text": "Customer SSN is 123-45-6789 and card is 4111111111111111"
}'
Resposta:
{
"success": true,
"data": {
"found": true,
"count": 2,
"findings": [
{
"type": "ssn",
"value": "123-45-6789",
"start": 17,
"end": 28,
"masked": "***-**-6789"
},
{
"type": "credit_card",
"value": "4111111111111111",
"start": 42,
"end": 58,
"masked": "************1111"
}
]
}
}
Se a resposta da sua API acionar descobertas, seu endpoint estará retornando dados que o cliente não deveria ver. Corrija a consulta ou DTO para excluir esses campos.
Criptografe dados confidenciais em repouso
Quando sua API armazenar configurações, tokens ou credenciais confidenciais, criptografe-os antes de gravar para o banco de dados. O API de criptografia botoi fornece criptografia AES-256-CBC:
curl -s -X POST https://api.botoi.com/v1/encrypt/encrypt \\
-H "Content-Type: application/json" \\
-d '{
"text": "sensitive-api-token-abc123",
"password": "your-secret-key"
}'
Resposta:
{
"success": true,
"data": {
"encrypted": "U2FsdGVkX1+abc...encrypted_output_here",
"algorithm": "aes-256-cbc"
}
}
Armazene a saída criptografada. Descriptografar com /v1/encrypt/decrypt somente quando o valor for
necessário. Isso limita o raio de explosão se um invasor obtiver acesso de leitura ao seu banco de dados por meio de um
Vulnerabilidade de injeção BOLA ou SQL.
A lista de verificação dos 10 principais segurança da API OWASP
Imprima esta tabela ou adicione-a ao seu modelo de revisão de segurança. Verifique cada item antes de qualquer lançamento de API.
| Risco | Verificar | ponto final do botoi |
|---|---|---|
| API1 ERA | Cada endpoint que aceita um ID de objeto verifica a propriedade | |
| API2 autenticação quebrada | Taxa de login limitada; os tokens expiram; MFA em operações sensíveis | /v1/breach/check |
| Autenticação de propriedade API3 | Campos de solicitação permitidos; resposta DTOs excluem internos | /v1/pii/detect |
| Limite de recursos API4 | Limites de taxa, limites de paginação, limites de tamanho de arquivo aplicados | |
| Autenticação de função API5 | Os endpoints administrativos verificam a função na camada API, não no frontend | |
| Fluxo de negócios API6 | CAPTCHA/prova de trabalho em fluxos de alto valor; limites por usuário | |
| SSRF API7 | URLs fornecidos pelo usuário validados; intervalos privados bloqueados | |
| Configuração incorreta da API8 | Sem rastreamentos de pilha; CORS restrito; HTML higienizado | /v1/html-sanitize |
| Inventário API9 | Versões antigas da API desativadas; todas as rotas documentadas | |
| Consumo inseguro API10 | Respostas de terceiros validadas e higienizadas antes do armazenamento | /v1/html-sanitize |
Para onde ir a partir daqui
A documentação completa do OWASP API Security Top 10 está disponível em owasp.org/API-Security. Cada página de risco inclui métodos de detecção, exemplos de cenários de ataque e referências a CWEs.
Para verificações automatizadas, integre os endpoints botoi acima ao seu pipeline de CI. Executar detecção de PII contra acessórios de resposta da API. Limpe o HTML armazenado na gravação. Verifique e-mails de novos usuários contra violações bancos de dados durante a inscrição. Estas são pequenas adições ao seu conjunto de testes que detectam os scanners de riscos senhorita.
FAQ
- Qual é o Top 10 de segurança da API OWASP?
- O OWASP API Security Top 10 é uma lista dos dez riscos de segurança de API mais críticos, mantida pelo Open Worldwide Application Security Project. A edição 2023 cobre autorização quebrada em nível de objeto, autenticação quebrada, autorização quebrada em nível de propriedade de objeto, consumo irrestrito de recursos, autorização quebrada em nível de função, acesso irrestrito a fluxos de negócios confidenciais, falsificação de solicitação do lado do servidor, configuração incorreta de segurança, gerenciamento impróprio de inventário e consumo inseguro de APIs.
- Com que frequência o Top 10 de segurança da API OWASP é atualizado?
- A OWASP lançou o primeiro API Security Top 10 em 2019 e o atualizou em 2023. Não há cronograma de atualização fixo. A equipe do projeto coleta dados de incidentes de segurança, relatórios de recompensas de bugs e contribuições da comunidade e, em seguida, publica uma nova edição quando o cenário de ameaças muda o suficiente para justificar uma.
- O que é BOLA e por que é o risco número um da API?
- BOLA (autorização em nível de objeto quebrado) acontece quando um endpoint de API aceita um ID de objeto do cliente e retorna dados sem verificar se o usuário solicitante possui esse objeto. Um invasor altera o ID na solicitação e acessa os dados de outro usuário. Ele ocupa o primeiro lugar porque é comum, fácil de explorar e frequentemente expõe registros confidenciais em grande escala.
- As ferramentas automatizadas podem detectar todos os 10 principais riscos de segurança da API OWASP?
- Não. Scanners automatizados detectam configurações incorretas (API8), limites de taxa ausentes (API4) e alguns padrões de injeção (via API8). Mas as falhas de autorização (API1, API3, API5) exigem o entendimento da lógica de negócios que falta aos scanners. Você precisa de revisão manual de código, testes de penetração e verificações em nível de arquitetura para obter cobertura completa.
- Como priorizo quais riscos da API OWASP devem ser corrigidos primeiro?
- Comece com API1 (BOLA) e API2 (autenticação quebrada) porque elas levam a violações diretas de dados. Em seguida, aborde API4 (Consumo Irrestrito de Recursos) para evitar negação de serviço. Depois disso, analise os riscos restantes com base em quais endpoints lidam com os dados mais confidenciais em seu aplicativo.
Comece a construir com botoi
150+ endpoints de API para consultas, processamento de texto, geração de imagens e utilitários para desenvolvedores. Plano gratuito, sem cartão de crédito.