Basicamente, cada vez que você usa algum dado inseguro (entrada do usuário, valor de um banco de dados, um arquivo ou um site externo, ou seja, qualquer dado que você não seja 100% certeza de que é seguro) em uma consulta SQL, você deve escapar usando mysql_real_escape_string . Observe que de acordo com OWASP , essa função não é segura para escapar de nomes de tabelas dinâmicas (mas isso é muito menos comum do que a inserção de entrada do usuário "básica").
Sugiro que você dê uma olhada em todo o artigo OWASP sobre injeção de SQL , e também para navegar no resto do site. É uma ótima fonte de informações sobre segurança em aplicações web.
IMO, a maneira preferida de impedir a injeção de SQL é usar declarações preparadas .
Por favor, lembre-se que se você escolher usar
mysql_real_escape_string()
ele só funciona quando usado dentro de uma string delimitada por aspas. Nunca use em quaisquer valores não citados. Isso inclui valores numéricos; em vez disso, valide se a entrada do usuário é realmente numérica.