API Security Checklist: README pt BR

[English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [Azərbaycan](./README-az.md) | [Български](./README-bg.md) | [বাংলা](./README-bn.md) | [Català](./README-ca.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ພາສາລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md)

# API Security Checklist

Lista das mais importantes medidas de segurança para o desenvolvimento, teste e publicação da sua API.

---

## Autenticação (_Authentication_)

- [ ] Não use `Basic Auth`. Use padrões de autenticação.
- [ ] Não reinvente a roda nos quesitos `Autenticação`, `geração de tokens` e `armazenamento de senhas`. Use os padrões recomendados para cada caso.
- [ ] Implemente funcionalidades de limite (_`Max Retry`_) e bloqueio de tentativas de autenticação.
- [ ] Use criptografia em todos os dados confidenciais.

## Acesso (_Access_)

- [ ] Limite a quantidade de requisições (_Throttling_) para evitar ataques DDoS e de força bruta.
- [ ] Use HTTPS no seu servidor para evitar ataques MITM (_Man In The Middle Attack_).
- [ ] Use cabeçalho `HSTS` com SSL para evitar ataques _SSL Strip_.
- [ ] Desative as listagens de diretórios.
- [ ] Para APIs privadas, permita o acesso apenas de IPs/hosts da lista branca (whitelist).

## Autorização (_Authorization_)

### OAuth

- [ ] Sempre valide o `redirect_uri` no seu servidor através de uma lista de URLs conhecidas (previamente cadastradas).
- [ ] Tente sempre retornar códigos de negociação, não o _token_ de acesso (não permita `response_type=token`).
- [ ] Utilize o parâmetro `state` com um _hash_ aleatório para previnir CSRF no processo de autenticação OAuth.
- [ ] Defina escopo de dados, e valide o parâmetro `scope` para cada aplicação.

## Requisição (_Input_)

- [ ] Utilize o método HTTP apropriado para cada operação, `GET (obter)`, `POST (criar)`, `PUT/PATCH (trocar/atualizar)` e `DELETE (apagar)`.
- [ ] Valide o tipo de conteúdo informado no cabeçalho `Accept` da requisição (_Content Negotiation_) para permitir apenas os formatos suportados pela sua API (ex. `application/xml`, `application/json` ... etc), respondendo com o status `406 Not Acceptable` se ele não for suportado.
- [ ] Valide o tipo de conteúdo do conteúdo da requisição informado no cabeçalho `Content-Type` da requisição para permitir apenas os formatos suportados pela sua API (ex. `application/x-www-form-urlencoded`, `multipart/form-data, application/json` ... etc).
- [ ] Valide o conteúdo da requisição para evitar as vulnerabilidades mais comuns (ex. `XSS`, `SQL-Injection`, `Remote Code Execution` ... etc).
- [ ] Não utilize nenhuma informação sensível (credenciais, senhas, _tokens_ de autenticação) na URL. Use o cabeçalho `Authorization` da requisição.
- [ ] Use apenas criptografia do lado do servidor.
- [ ] Use um serviço _gateway_ para a sua API para habilitar _cache_, limitar acessos sucessivos (ex. por quantidade máxima permitida (_Quota_), por limitar tráfego em situações de estresse (_spike arrest_) ou por limitar o número de conexões simultâneas na sua API (_Concurrent Rate Limit_)), e facilitar o _deploy_ de novas funcionalidades.

## Processamento (_Processing_)

- [ ] Verifique continuamente os _endpoints_ protegidos por autenticação para evitar falhas na proteção de acesso aos dados.
- [ ] Não utilize a identificação do próprio usuário. Use `/me/orders` no lugar de `/user/654321/orders`.
- [ ] Não utilize ID's incrementais. Use UUID.
- [ ] Se você estiver processando arquivos XML, verifique que _entity parsing_ não está ativada para evitar ataques de XML externo (XXE - _XML external entity attack_).
- [ ] Se você estiver processando arquivos XML, verifique que _entity expansion_ não está ativada para evitar _Billion Laughs/XML bomb_ através de ataques exponenciais de expansão de XML.
- [ ] Use CDN para _uploads_ de arquivos.
- [ ] Se você estiver trabalhando com uma grande quantidade de dados, use _workers_ e _queues_ (fila de processos) para retornar uma resposta rapidamente e evitar o bloqueio de requisições HTTP.
- [ ] Não se esqueça de desativar o modo de depuração (_DEBUG mode OFF_).
- [ ] Use stacks não executáveis quando disponíveis.

## Resposta (_Output_)

- [ ] Envie o cabeçalho `X-Content-Type-Options: nosniff`.
- [ ] Envie o cabeçalho `X-Frame-Options: deny`.
- [ ] Envie o cabeçalho `Content-Security-Policy: default-src 'none'`.
- [ ] Remova os cabeçalhos de identificação dos _softwares_ do servidor - `X-Powered-By`, `Server`, `X-AspNet-Version`.
- [ ] Envie um cabeçalho `Content-Type` na sua resposta com o valor apropriado (ex. se você retorna um JSON, então envie um `Content-Type: application/json`).
- [ ] Do not return overly specific error messages to the client that could reveal implementation details, use generic messages instead, and log detailed information only on the server side.
- [ ] Não retorne dados sensíveis como senhas, credenciais e tokens de autenticação.
- [ ] Utilize o código de resposta apropriado para cada operação. Ex. `200 OK` (respondido com sucesso), `201 Created` (novo recurso criado), `400 Bad Request` (requisição inválida), `401 Unauthorized` (não autenticado), `405 Method Not Allowed` (método HTTP não permitido) ... etc.

## CI & CD

- [ ] Monitore a especificação e implementação do escopo da sua API através de testes unitários e de integração.
- [ ] Use um processo de revisão de código, ignorando sistemas de auto-aprovação.
- [ ] Certifique-se de que todos os componentes de seus serviços sejam validados por _softwares_ AV (anti-vírus, anti-_malware_) antes de enviar para produção, incluindo as dependências de terceiros utilizadas.
- [ ] Execute continuamente testes de segurança (análise estática/dinâmica) em seu código.
- [ ] Verifique suas dependências (software e sistema operacional) para vulnerabilidades conhecidas.
- [ ] Implemente funcionalidade de reversão de _deploy_ (_rollback_).

## Monitoramento (_Monitoring_)

- [ ] Use logins centralizados para todos os serviços e componentes.
- [ ] Use agentes para monitorar todo o tráfego, erros, solicitações, e respostas.
- [ ] Use alertas para SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc.
- [ ] Verifique se você não está registrando dados confidenciais, como cartões de crédito, senhas, PINs, etc.
- [ ] Use um sistema IDS e/ou IPS para monitorar as solicitações e instâncias de sua API.

---

## Veja também:

- [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Uma coleção de recursos útei