{
 "grupo": "seguranca",
 "descricao": "Segurança",
 "itens": [
  {
   "id": "seg-segredo-no-codigo",
   "nome": "Achar segredo no código",
   "receita": "rg -n \"(api[_-]?key",
   "prova": "secret"
  },
  {
   "id": "seg-revogar-chave",
   "nome": "Chave vazou",
   "receita": "revogue e gere nova ANTES de limpar o git; veja o log de uso",
   "prova": "chave antiga retorna 401"
  },
  {
   "id": "seg-senha",
   "nome": "Guardar senha",
   "receita": "argon2id ou bcrypt com custo; nunca MD5/SHA puro; nunca log de senha",
   "prova": "hash no banco, senha em lugar nenhum"
  },
  {
   "id": "seg-sqli",
   "nome": "Injeção de SQL",
   "receita": "parâmetros (?, $1) sempre; nunca concatenar entrada",
   "prova": "payload ' OR 1=1-- não altera a consulta"
  },
  {
   "id": "seg-xss",
   "nome": "XSS",
   "receita": "escape por contexto; textContent em vez de innerHTML; CSP; sanitize HTML permitido",
   "prova": "<script> digitado aparece como texto"
  },
  {
   "id": "seg-csrf",
   "nome": "CSRF",
   "receita": "SameSite=Lax/Strict, token em formulário, cheque Origin",
   "prova": "POST de outro site rejeitado"
  },
  {
   "id": "seg-ssrf",
   "nome": "SSRF",
   "receita": "nunca buscar URL do usuário sem lista de destinos; bloqueie IPs internos",
   "prova": "http://169.254.169.254 recusado"
  },
  {
   "id": "seg-autorizacao",
   "nome": "Autorização por recurso",
   "receita": "em TODA rota, cheque se o usuário é dono do id pedido (IDOR)",
   "prova": "usuário A não lê dado do B"
  },
  {
   "id": "seg-jwt",
   "nome": "JWT sem erro",
   "receita": "assine com segredo forte, valide alg/exp/aud, curta duração, refresh seguro",
   "prova": "token adulterado recusado"
  },
  {
   "id": "seg-cookies",
   "nome": "Cookies de sessão",
   "receita": "HttpOnly, Secure, SameSite; rotacione ao logar",
   "prova": "flags vistas no DevTools"
  },
  {
   "id": "seg-dependencias",
   "nome": "Dependência vulnerável",
   "receita": "npm audit / pip-audit; atualize a menor versão que corrige; teste",
   "prova": "auditoria sem alta/crítica"
  },
  {
   "id": "seg-upload",
   "nome": "Upload seguro",
   "receita": "tipo pelo conteúdo, limite, nome gerado, fora do diretório público",
   "prova": ".php disfarçado recusado"
  },
  {
   "id": "seg-path-traversal",
   "nome": "Caminho de arquivo",
   "receita": "resolva o caminho e confira que continua dentro da pasta base",
   "prova": "../../etc/passwd recusado"
  },
  {
   "id": "seg-shell-injection",
   "nome": "Injeção de comando",
   "receita": "passe argumentos em array (execFile/subprocess sem shell), nunca monte string",
   "prova": "; rm -rf digitado vira texto"
  },
  {
   "id": "seg-rate-limit",
   "nome": "Limitar tentativas",
   "receita": "por IP e por conta; backoff; bloqueio temporário; avisar o dono",
   "prova": "6ª tentativa recusada"
  },
  {
   "id": "seg-logs-sem-segredo",
   "nome": "Logs sem segredo",
   "receita": "mascare token, senha, cartão, CPF; teste com dado falso",
   "prova": "rg pelo valor de teste nos logs vazio"
  },
  {
   "id": "seg-permissao-minima",
   "nome": "Permissão mínima",
   "receita": "chave com escopo só do que usa; usuário de banco sem DROP; container não-root",
   "prova": "teste de permissão negada"
  },
  {
   "id": "seg-backup-teste",
   "nome": "Backup que restaura",
   "receita": "restaure num ambiente de teste e confira",
   "prova": "restauração concluída"
  },
  {
   "id": "seg-headers-https",
   "nome": "Transporte seguro",
   "receita": "HTTPS em tudo, HSTS, cookies Secure, TLS atual",
   "prova": "curl confere"
  },
  {
   "id": "seg-checklist-deploy",
   "nome": "Checklist antes do deploy",
   "receita": "debug desligado, segredos em variáveis, CORS restrito, erros sem pilha ao usuário, backups",
   "prova": "lista marcada item a item"
  },
  {
   "id": "seg-modelo-ameaca",
   "nome": "Modelo de ameaça rápido",
   "receita": "ativos, quem ataca, por onde entra, o que perde; 5 riscos ordenados",
   "prova": "tabela de 5 linhas com mitigação"
  }
 ]
}
