Tudo o que vi nos ataques de injeção de SQL parece sugerir que consultas parametrizadas, principalmente as de procedimentos armazenados, são a única maneira de se proteger contra esses ataques. Enquanto eu trabalhava (na Idade das Trevas), os procedimentos armazenados eram vistos como uma prática ruim, principalmente porque eram vistos como menos sustentáveis; menos testável; altamente acoplado; e bloqueou um sistema em um fornecedor; ( esta pergunta cobre alguns outros motivos).
Embora quando eu estivesse trabalhando, os projetos praticamente não tivessem consciência da possibilidade de tais ataques; várias regras foram adotadas para proteger o banco de dados contra corrupção de vários tipos. Essas regras podem ser resumidas como:
- Nenhum cliente / aplicativo teve acesso direto às tabelas do banco de dados.
- Todos os acessos a todas as tabelas eram através de visualizações (e todas as atualizações nas tabelas base eram feitas através de gatilhos).
- Todos os itens de dados tinham um domínio especificado.
- Nenhum item de dados podia ser anulável - isso tinha implicações que os DBAs rangiam os dentes de vez em quando; mas foi aplicado.
- As funções e permissões foram configuradas adequadamente - por exemplo, uma função restrita para fornecer apenas às visualizações o direito de alterar os dados.
Portanto, um conjunto de regras (aplicadas) como essa (embora não necessariamente esse conjunto em particular) seja uma alternativa apropriada para consultas parametrizadas na prevenção de ataques de injeção de SQL? Se não, por que não? Um banco de dados pode ser protegido contra esses ataques por medidas específicas do banco de dados (apenas)?
EDITAR
A ênfase da pergunta mudou um pouco, à luz das respostas iniciais recebidas. Pergunta base inalterada.
EDIT2
A abordagem de confiar em consultas paramaterizadas parece ser apenas um passo periférico na defesa contra ataques a sistemas. Parece-me que as defesas mais fundamentais são desejáveis e podem tornar a confiança nessas consultas desnecessária ou menos crítica, mesmo para se defender especificamente contra ataques de injeção.
A abordagem implícita na minha pergunta foi baseada em "blindar" o banco de dados e eu não tinha idéia se era uma opção viável. Pesquisas posteriores sugeriram que existem tais abordagens. Encontrei as seguintes fontes que fornecem alguns ponteiros para esse tipo de abordagem:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Os principais recursos que tirei dessas fontes são:
- Um extenso dicionário de dados, combinado com um extenso dicionário de dados de segurança
- Geração de gatilhos, consultas e restrições do dicionário de dados
- Minimize o código e maximize os dados
Embora as respostas que recebi até o momento sejam muito úteis e apontem dificuldades decorrentes da desconsideração de consultas paramaterizadas, em última análise, elas não respondem às minhas perguntas originais (agora enfatizadas em negrito).