Seu palpite estava correto: o banco de dados é o lugar errado para resolver esse problema. A razão pela qual as injeções de SQL funcionam é porque os comandos são SQL válidos. Geralmente, no momento em que seu aplicativo passa a consulta para o servidor de banco de dados, os caracteres especiais foram transformados novamente em texto normal.
Se você não quiser mitigar isso no nível do aplicativo, deve procurar soluções de firewall de software, como o dotDefender. Na minha opinião, isso também está atacando o problema no lugar errado e, eventualmente, algo passará pela lógica do firewall.