Entrada que vira comando
O perigo começa onde um valor que o usuário escolhe entra no texto de um comando.
Um programa confia no que ele mesmo escreveu e desconfia do que vem de fora. Entrada contaminada (tainted input em inglês) é qualquer valor que chega do usuário: um campo de formulário, um parâmetro da URL, um cabeçalho. O problema de segurança nasce no ponto exato em que esse valor, sem ser conferido, entra num comando que o programa vai executar: uma consulta SQL, um comando de terminal, um nome de arquivo.
Revisar código em busca de injeção é seguir cada entrada desde onde ela chega até onde ela é usada. Se no caminho ela é convertida (virar inteiro com (int)), conferida (comparada com uma lista fixa de valores aceitos) ou entregue como dado (parâmetro de consulta), ela está segura. Se ela é colada no texto do comando com + ou com aspas, ali está o furo.
No exemplo abaixo, três entradas chegam pela URL. Duas passam por uma defesa; uma vai crua para dentro do SQL. Só essa última é um ponto de injeção.