Injeções: separar uma instrução dos dados
O único princípio
O motor deve receber o comando e os dados separadamente. Consultas parametrizadas, comandos do sistema com um array de argumentos e motores de templates que marcam conteúdo não seguro. Filtrar strings é uma corrida que você sempre perde.
Onde aparece
Bancos de dados, comandos do sistema operacional, consultas a bibliotecas, chamadas a um motor de busca e também em endereços construídos dinamicamente. E sim — também em prompts para um modelo de linguagem, onde conteúdo externo pode ser interpretado como uma instrução.
Defesa em profundidade
Permissões mínimas para o usuário do banco de dados, para que mesmo que algo passe, o dano seja limitado. E validação da entrada contra um esquema — não como substituto para a separação, mas como camada adicional que bloqueia entrada absurda desde o início.
Indo mais fundo
Execute testes automáticos que alimentem entrada incomum em cada campo — caracteres especiais, comprimento extremo, codificações diferentes — e verifique que a resposta é um erro ordenado e não um comportamento anômalo. Isso captura também bugs comuns, não só vulnerabilidades.