E como podemos nos defender da injeção de comandos SQL?
Em primeiro lugar, JAMAIS concatene dados externos com comandos SQL a serem executados.
Uma solução eficaz é usar apenas stored procedures para consultas e atualizações, retirando do usuário de produção o privilégio de efetuar consulta em quaisquer tabelas. Desta forma todo acesso deve passar por stored procedures e nunca por comandos SQL enviados pelo aplicativo.
Se você achar o uso de stored procedures uma solução muito radical, existe uma alternativa para usar com queries em geral: use sempre queries parametrizadas em seus comandos SQL. Isto obriga os dados entrados a serem de tipos corretos e também evita que strings de dados sejam enxergadas como comandos.